java - 从单独的类(初学者)启动 JPanel

标签 java swing jframe jpanel

我尝试在单独的类中构建 JPanel,以单独调用它们并在其上添加不同的项目。你能告诉我我做错了什么吗?

MyFrame.java

import javax.swing.*;
import java.awt.*;

public class MyFrame extends JFrame {

    public static void main(String[] args) {

        MyFrame frame = new MyFrame();
        frame.setVisible(true);

    }

    public MyFrame() {

       setTitle("MyFrame");
       setSize(300, 200);
       setLocationRelativeTo(null);
       setDefaultCloseOperation(EXIT_ON_CLOSE);

       MyPanel panel = new MyPanel();

       JButton testButton = new JButton("Test");
       panel.add(testButton);

    }

}

MyPanel.java

import javax.swing.*;
import java.awt.*;

class MyPanel extends JPanel {

    public MyPanel() {

        this.setOpaque(true);
        this.setVisible(true); 

    }

}

最佳答案

您没有将面板变量添加到 JFrame 的 contentPane。

添加:

public MyFrame() {
   setTitle("MyFrame");
   // setSize(300, 200); // let's avoid this
   setDefaultCloseOperation(EXIT_ON_CLOSE);

   MyPanel panel = new MyPanel();

   JButton testButton = new JButton("Test");
   panel.add(testButton);
   add(panel);  // *** here
   pack();  // this tells the layout managers to do their thing
   setLocationRelativeTo(null);  
   setVisible(true);
}

作为旁注:

public MyPanel() {

    this.setOpaque(true);
    this.setVisible(true); 

}

默认情况下,JPanel 是不透明和可见的,因此您在 MyPanel 构造函数中的方法调用没有任何用处。

旁注 2:我很少扩展 JFrame 或任何其他顶级窗口(JApplet 除外,如果我被迫使用其中之一),因为我很少更改窗口的固有行为。我认为最好在需要时创建我的顶级窗口(即我的 JFrames)。

旁注 3:始终努力在 Swing 事件线程上启动 Swing GUI。也是……

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            MyFrame frame = new MyFrame();
            frame.setVisible(true);
        }
    });
}

编辑
你问:

You wrote lets avoid setting the size.. can you tell me how i can pack it but set a minimum frame size?

我喜欢覆盖 JPanel 的 getPreferredSize() 方法,并让它返回一个有意义的维度。

例如,您可以这样做以确保您的 GUI 的大小至少为 PREF_W 乘以 PREF_H:

import java.awt.Dimension;

import javax.swing.*;

public class ShowGetPreferredSize extends JPanel {
   private static final int PREF_W = 400;
   private static final int PREF_H = PREF_W;

   @Override
   public Dimension getPreferredSize() {
      Dimension superSize = super.getPreferredSize();
      if (isPreferredSizeSet()) {
         return superSize;
      }
      int w = Math.max(superSize.width, PREF_W);
      int h = Math.max(superSize.height, PREF_H);
      return new Dimension(w, h);
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("ShowGetPreferredSize");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(new ShowGetPreferredSize());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

关于java - 从单独的类(初学者)启动 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28332802/

相关文章:

java - 网址格式错误异常

java - 从 Scanner 替换文件中的一行

java - 单击十字时在系统托盘中添加 jframe,而不是在最小化按钮的情况下添加 jframe

java - 单击按钮时 Windows 未打开

java - 在创建 JFrame 之前打开 MIDI Synth 会导致 JVM 挂起

Java : Expose only a single package in a jar file

java - 如果特定的外部程序启动,则让 Java 程序自行终止

java - 你如何在java swing包中制作一个专栏

java - 无法将 JPanel 添加到 BorderLayout.CENTER

java - 为什么 JButton 不显示,除非在将 JButton 添加到 JPanel 后设置文本?