Странная проблема с отображением JFrame - PullRequest
2 голосов
/ 30 декабря 2011

В следующем простом коде я просто создаю фрейм и добавляю JPanel и menubar к нему.

public class MainFrame extends JFrame {
    private DrawPanel drawPanel;
    public MainFrame()
    {
        super("Coordinate Geometry Visualiser");
        drawPanel = new DrawPanel();
        add(drawPanel);

        JMenu fileMenu = new JMenu("File");
        fileMenu.setMnemonic('F');

        JMenuItem newItem = new JMenuItem("New");
        newItem.setMnemonic('N');
        fileMenu.add(newItem);

        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);
        menuBar.add(fileMenu);

        JMenu editMenu = new JMenu("Edit");
        editMenu.setMnemonic('E');
        menuBar.add(editMenu);
    }
}

Код панели рисования -

public class DrawPanel extends JPanel {
    public DrawPanel()
    {
    }
    public void paintComponent(Graphics g) 
    {
        super.paintComponents(g);
        setBackground(Color.BLACK);
        g.setColor(Color.RED);
        g.drawLine(100, 50, 150, 100);
    }
}

инаконец приложение с main()

public class CGVApplication {
    public static void main(String[] args) {
        MainFrame appFrame = new MainFrame();
        appFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        appFrame.setSize(300, 275);
        appFrame.setVisible(true);
    }
}

При запуске приложения внутри eclipse , вот что я получаю - enter image description here enter image description here

Почему двойной menubar и line ?Это очень раздражает.При циклическом переключении между приложениями или при появлении всплывающего окна с перерисованным окном все в порядке (правое изображение).

Также в моем DrawPanel paintComponent я установил черный фон, но никакого эффекта?

В чем причина вышеуказанных двух проблем?Пожалуйста, помогите!

Ответы [ 2 ]

5 голосов
/ 30 декабря 2011

Вы вызываете метод Container.paintComponents (). Это должно быть super.paintComponent(g).

@Override
public void paintComponent(Graphics g) 
{
    super.paintComponent(g); //super.paintComponents(g);
    setBackground(Color.BLACK);
    g.setColor(Color.RED);
    g.drawLine(100, 50, 150, 100);
}
3 голосов
/ 30 декабря 2011

Javadoc упоминает, что

  • isOpaque должно быть истинным
  • , что в зависимости от L & F, это свойство может игнорироваться
  • , что подклассы JComponent должны переопределять paintComponentчтобы соблюдать это свойство.

Помещение setBackground в конструктор и добавление этих двух строк кода в paintComponent (до рисования красной линии) делает панель черной.

g.setColor(getBackground());
g.fillRect(getX(), getY(), getWidth(), getHeight());

Также обратите внимание, что компоненты Swing всегда должны создаваться и изменяться в EDT.Ваш основной метод должен быть таким:

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            MainFrame appFrame = new MainFrame();
            appFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            appFrame.setSize(300, 275);
            appFrame.setVisible(true);
        }
    });
}
...