Фрейм отображается только при вызове конструктора

#java #swing #jframe

#ява #качели #jфрейм #swing #jframe

Вопрос:

Я нашел этот код в Интернете. Я выполнил его, и он выполняется нормально. Затем я переместил часть конструктора в метод и, создав объект, попытался вызвать метод. Я не знаю, чего мне не хватает, но Рамка просто не появляется. Что не так при переносе конструктора в метод?

Работающий

 import java.awt.event.MouseEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.KeyEvent;
    import java.io.IOException;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.MouseListener;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import javax.imageio.ImageIO;
    public class MyFrame extends JFrame
    {
        Container cont;
        JLabel label = new JLabel();

        public MyFrame() throws IOException
        {   

            setSize(300,300);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            BufferedImage img = ImageIO.read(new File("C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg"));
            System.out.println(img.toString());

            label.setIcon(new ImageIcon(img));

            cont = (Container) getContentPane().add(label);
            cont.setFocusable(true);
            InputHandler hand = new InputHandler();
            cont.addKeyListener(hand);
            cont.addMouseListener(hand);
            cont.setBackground(Color.BLACK);
        }
        public class InputHandler implements KeyListener, MouseListener
        {
            public void keyTyped(KeyEvent kt)
            {
                System.out.println(kt.getKeyChar());
            }
            public void keyPressed(KeyEvent kp)
            {
                if(kp.getKeyChar() == 'w')
                {
                    cont.setBackground(Color.PINK);
                    repaint();
                }
            }
            public void keyReleased(KeyEvent kr)
            {
                System.out.println(kr.getKeyChar());
            }

            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("Mouse CLicked");
                    }

            @Override
            public void mousePressed(MouseEvent e) {
                System.out.println("Mosue Pressed");
                    }

            @Override
            public void mouseReleased(MouseEvent e) {
                System.out.println("Mosue Released");
                    }

            @Override
            public void mouseEntered(MouseEvent e) {
                System.out.println("Mouse Entered");
                    }

            @Override
            public void mouseExited(MouseEvent e) {
                System.out.println("Mosue Exited");
                    }
        }

        public static void main(String[] args) throws IOException {
            new MyFrame().setVisible(true);

        }
    }
  

РЕДАКТИРОВАТЬ: Изменен код (не работает)

 import java.awt.event.MouseEvent;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.io.IOException;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class MyFrame extends JFrame
{
    Container cont;
    JLabel label = new JLabel();

   void MyFrame(){

   }
    public void Display() throws IOException
    {   

        setSize(280,480);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        BufferedImage img = ImageIO.read(new File("C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg"));
        System.out.println(img.toString());

        label.setIcon(new ImageIcon(img));

        cont = (Container) getContentPane().add(label);
        cont.setFocusable(true);
        InputHandler hand = new InputHandler();
        cont.addKeyListener(hand);
        cont.addMouseListener(hand);
        cont.setBackground(Color.BLACK);
       rootPane.setVisible(true);


    }
    public class InputHandler implements KeyListener, MouseListener
    {
        public void keyTyped(KeyEvent kt)
        {
            System.out.println(kt.getKeyChar());
        }
        public void keyPressed(KeyEvent kp)
        {
            if(kp.getKeyChar() == 'w')
            {
                cont.setBackground(Color.PINK);
                repaint();
            }
        }
        public void keyReleased(KeyEvent kr)
        {
            System.out.println(kr.getKeyChar());
        }

        @Override
        public void mouseClicked(MouseEvent e) {
            System.out.println("Mouse CLicked");
                }

        @Override
        public void mousePressed(MouseEvent e) {
            System.out.println("Mosue Pressed");
                }

        @Override
        public void mouseReleased(MouseEvent e) {
            System.out.println("Mosue Released");
                }

        @Override
        public void mouseEntered(MouseEvent e) {
            System.out.println("Mouse Entered");
                }

        @Override
        public void mouseExited(MouseEvent e) {
            System.out.println("Mosue Exited");
                }
    }

    public static void main(String[] args) throws IOException {
        MyFrame mf = new MyFrame();
        mf.Display();

    }
}
  

Ответ №1:

Просто замените rootPane.setVisible(true); на setVisible(true); в вашем Display() методе, и он должен отобразить ваш JFrame .

Ответ №2:

вы получаете исключение из-за этой строки:

 BufferedImage img = ImageIO.read(new File("C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg"));
  

потому что он не может загрузить его … так как у вас, вероятно, нет этого файла на вашем компьютере

чтобы увидеть, как это работает, удалите следующие строки:

 BufferedImage img = ImageIO.read(new File("C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg"));
System.out.println(img.toString());

label.setIcon(new ImageIcon(img));
  

Комментарии:

1. Я не получил никакого исключения. Сборка выполнена успешно, но рамка не будет отображаться. Также у меня есть файл в этом месте. Он загружается, когда деталь находится в конструкторе.

2. потому что это исключение во время выполнения, а не исключение во время компиляции.. таким образом, ваш код будет скомпилирован нормально

Ответ №3:

Вероятно, вы сделали это неправильно.

http://download.oracle.com/javase/6/docs/api/javax/swing/JFrame.html

 public static void main(String [] args){
    JFrame jf = new JFrame("JChooser");
    jf.setSize(400,400);
    jf.setVisible(true);
}
  

Это работает, и это в основном методе.

Комментарии:

1. JFrame jf = new JFrame("JChooser"); просто создаст новый фрейм.