从单独的 class(初学者)启动 JPanel
Initiate a JPanel from a separate class (beginner)
我尝试在单独的 class 中构建 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 或任何其他顶级 window(JApplet 除外,如果我被迫使用其中之一),因为我很少更改先天行为的 window。更好的是,我认为在需要时创建我的顶级 windows(即我的 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()
方法,并使其 return 成为一个有意义的维度。
例如,您可以这样做以确保您的 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();
}
});
}
}
我尝试在单独的 class 中构建 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 或任何其他顶级 window(JApplet 除外,如果我被迫使用其中之一),因为我很少更改先天行为的 window。更好的是,我认为在需要时创建我的顶级 windows(即我的 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()
方法,并使其 return 成为一个有意义的维度。
例如,您可以这样做以确保您的 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();
}
});
}
}