2013-09-18 3 views
1

, поэтому я играю с JPanels и JFrames, и я замечаю, что созданный JPanel не отображается, когда я добавляю его в объект Jframe. Обратите внимание, что когда я создал JPanel в моем конструкторе Jframe, давая параметры jpanel перед добавлением в Jframe, он работал. Однако теперь я использую объект JPanel, который я создал, и он больше не работает. Это то, что я сделал.JPanel не отображается в моем JFrame

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.GridLayout; 
import java.awt.Point; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class MyGui extends JFrame { 

    MyMouseListener listen = new MyMouseListener(); 

    public MyGui() { 
     setSize(500, 500); 
     //setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); 
     getContentPane().setBackground(Color.WHITE); 
     addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 
     Panel panel = new Panel(); 
     add(panel, BorderLayout.WEST); 
     //setVisible(true); 
     show(); 
    } 

    public static void main(String[] a) { 
     MyGui gui = new MyGui(); 
    } 
} 

class Panel extends JPanel { 

    MyMouseListener listen = new MyMouseListener(); 

    public Panel() { 
     setPreferredSize(new Dimension(300, 300)); 
     addMouseListener(listen); 
     setBackground(Color.YELLOW); 
     setLayout(new GridLayout(3, 1)); 
    } 

    public void paint(Graphics g) { 
     super.paintComponents(g); 
     g.drawOval((int) Math.round(listen.p.getX()), 
       (int) Math.round(listen.p.getX()), 1, 1); 
    } 
} 

class MyMouseListener implements MouseListener { 

    Point p = new Point(); 

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

    @Override 
    public void mousePressed(MouseEvent e) { 
     p = e.getPoint(); 
     System.out.println(p); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
    } 
} 

EDIT: На самом деле я думаю, что я нашел ошибку. JPanel имеет метод рисования, который при удалении позволяет Jframe отображать панель. Однако мне нужно уметь рисовать вещи на JPanel.

+0

Прежде чем показывать рамку, вызовите пакет() или setSize(). Если вы добавите панель после показа вызова revalidate(); перекрасить(); – StanislavL

+0

Единственное, что я изменил в своем коде, чтобы увидеть вашу панель, это изменить 'super.paintComponents (g);' на 'super.paintComponent (g);'. Это все еще не касается вашего овала, который не окрашен. –

+0

@JonathanDrapeau Так это выглядело понравилось это?public void paintComponent (Графика g) { \t \t super.paintComponent (g); \t \t g.drawOval ((int) Math.round (listen.p.getX()), (int) Math.round (listen.p.getX()), 1, 1); \t} –

ответ

4

его

super.paintComponent(g);

Совет:

1) Вы делаете вещи излишне сложными. например, чтобы закрыть окно, вы должны использовать

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

вместо вызова System.exit(0); и с помощью окна слушателей

2) По словам @mKorbel, вы должны использовать SwingUtilities.invokeLater, чтобы начать свой графический интерфейс, как Java GUI должны запускаться на EDT (Thread Dispatch Thread) и не должны запускаться в основном потоке.

+0

Спасибо за ваши предложения. Я изменил свой код с изменениями. Во всяком случае, извлечение super.paintComponent (g) все еще не делает JPanel видимым в JFrame. –

+0

Вам не нужно ничего вынимать. Просто удалите ** s ** в строке 'super.paintComponents (g);' внутри вашей 'paint'. Теперь это должно выглядеть как' super.paintComponent (g); '. Затем он работает нормально –

+0

Я тоже это сделал, и он все еще не работает. public void paintComponent (Графика g) { \t \t super.paintComponent (g); \t \t g.drawOval ((int) Math.round (listen.p.getX()), (int) Math.round (listen.p.getX()), 1, 1); \t} –

0

Вы пытались установить диспетчер компоновки и добавить панель в контентную панель вместо самого JFrame?

getContentPane().setLayout(new BorderLayout()); 
getContentPane().add(panel, BorderLayout.WEST); 
+0

Спасибо. Я пробовал это, но это не сработало. –

+0

Вы всегда должны добавлять свою панель в contentPane. http://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html –

0

По умолчанию менеджер компоновки для кадра FlowLayout не BorderLayout. Попробуйте setLayout(new BorderLayout()) в вашем MyGui contructor.

+0

Спасибо. Я попробовал, но это не сработало. –

+0

По умолчанию 'Layout' для' JFrame' является 'BorderLayout', а не' FlowLayout' –

0

Вы не установили макет в свою область содержимого. попробуйте коснуться как getContentPane.setLayout(new Layout())

Посмотреть оракула документы для получения подробной информации о менеджеров компоновки: http://docs.oracle.com/javase/tutorial/uiswing/layout/layoutlist.html

надеюсь, что это helpgs

2

1) super.paintComponents(g); внутри paint() может быть

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    .... 
} 

2) не устанавливать любой размер setSize(500,500); или setPreferredSize(new Dimension(300, 300));, чтобы использовать pack(), а затем (раскоментируйте) setVisible(true) для JFrame и переопределить getPreferredSize() для JPanel

3) MyGui gui=new MyGui(); внутри public static void main(String []a){, должны быть обернуты в invokeLater, более видеть в Oracle tutorial Initial Thread

+0

. Предпочитаемый размер устанавливается в 'JPanel', что делает' pack() 'и' setVisible' корректным. –

+1

@ Джонатан Драпау [согласен с окончательным результатом, но не о хороших практиках кодирования] (http://stackoverflow.com/a/9258934/714968) – mKorbel

+0

@mKorbel Вы говорите о paintComponent внутри JPanel? потому что я включил вызов супер и прокомментировал это, и в обоих случаях JPanel все еще не появлялся. –

Смежные вопросы