从另一个 class 加载面板
Loading a panel from a different class
我有两个 class。主 class 有一个 JFrame 并包含一个按钮,单击该按钮后,它会从另一个 class 加载一个面板并将其定位在框架的按钮中。
我可以做到,但我必须重新调整框架的大小,然后才会出现附加面板,否则它会被隐藏。
这是我的代码:
public class PanelLoader {
public static void main(String[] args) {
// TODO code application logic here
JFrame frame = new JFrame("Layout");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
JPanel mainPanel = new JPanel(new BorderLayout());
JButton press = new JButton("press");
press.addActionListener(new ActionListener(){ //ActionListener, on click it opens a file choser,
@Override //selects a directory then gives it to srcDirField
public void actionPerformed(java.awt.event.ActionEvent event){
JPanel mine = ClassWhereStored.newJPanel();
mainPanel.add(mine, BorderLayout.SOUTH);
}
});
mainPanel.add(press, BorderLayout.NORTH);
frame.add(mainPanel);
frame.setVisible(true);
}
}
第二个Class:
public class ClassWhereStored {
public static JPanel newJPanel(){
JPanel panel = new JPanel();
panel.setBackground(Color.yellow);
JLabel test= new JLabel("Some Text");
panel.add(test);
return panel;
}
}
那么只有在我调整框架大小时才显示附加面板的框架有什么问题?
使用一个CardLayout
,添加一个blank/empty JPanel
和你要显示的JPanel
。单击该按钮后,只需让 CardLayout
切换面板即可。
有关详细信息,请参阅 How to Use CardLayout
例如...
package javaapplication765;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new BasePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class BasePane extends JPanel {
public BasePane() {
setLayout(new BorderLayout());
CardLayout cl = new CardLayout();
JPanel mainView = new JPanel(cl);
mainView.add(new JPanel(), "empty");
mainView.add(new BananaPane(), "banana");
add(mainView);
JButton btn = new JButton("Fruit loop");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cl.show(mainView, "banana");
}
});
add(btn, BorderLayout.NORTH);
}
}
public class BananaPane extends JPanel {
public BananaPane() {
setLayout(new BorderLayout());
setBorder(new EmptyBorder(25, 25, 25, 25));
add(new JLabel("I'm a banana"));
}
}
}
- 尽可能避免静态方法,因为这有增加耦合和降低内聚的风险。
- 至于你的问题,你最好使用 CardLayout 并将新的 JPanel 添加到 CardLayout-using 容器中,JPanel 位于 SOUTH,但隐藏,比如被 JLabel 覆盖,该 JLabel 也被添加到相同的 CardLayout-using 容器并且正在显示。这样,容器(使用 CardLayout 的南部 JPanel)的大小将被调整以容纳它包含的所有 "cards",只要在 gui 创建时添加 "card" 组件。
我有两个 class。主 class 有一个 JFrame 并包含一个按钮,单击该按钮后,它会从另一个 class 加载一个面板并将其定位在框架的按钮中。
我可以做到,但我必须重新调整框架的大小,然后才会出现附加面板,否则它会被隐藏。
这是我的代码:
public class PanelLoader {
public static void main(String[] args) {
// TODO code application logic here
JFrame frame = new JFrame("Layout");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
JPanel mainPanel = new JPanel(new BorderLayout());
JButton press = new JButton("press");
press.addActionListener(new ActionListener(){ //ActionListener, on click it opens a file choser,
@Override //selects a directory then gives it to srcDirField
public void actionPerformed(java.awt.event.ActionEvent event){
JPanel mine = ClassWhereStored.newJPanel();
mainPanel.add(mine, BorderLayout.SOUTH);
}
});
mainPanel.add(press, BorderLayout.NORTH);
frame.add(mainPanel);
frame.setVisible(true);
}
}
第二个Class:
public class ClassWhereStored {
public static JPanel newJPanel(){
JPanel panel = new JPanel();
panel.setBackground(Color.yellow);
JLabel test= new JLabel("Some Text");
panel.add(test);
return panel;
}
}
那么只有在我调整框架大小时才显示附加面板的框架有什么问题?
使用一个CardLayout
,添加一个blank/empty JPanel
和你要显示的JPanel
。单击该按钮后,只需让 CardLayout
切换面板即可。
有关详细信息,请参阅 How to Use CardLayout
例如...
package javaapplication765;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new BasePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class BasePane extends JPanel {
public BasePane() {
setLayout(new BorderLayout());
CardLayout cl = new CardLayout();
JPanel mainView = new JPanel(cl);
mainView.add(new JPanel(), "empty");
mainView.add(new BananaPane(), "banana");
add(mainView);
JButton btn = new JButton("Fruit loop");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cl.show(mainView, "banana");
}
});
add(btn, BorderLayout.NORTH);
}
}
public class BananaPane extends JPanel {
public BananaPane() {
setLayout(new BorderLayout());
setBorder(new EmptyBorder(25, 25, 25, 25));
add(new JLabel("I'm a banana"));
}
}
}
- 尽可能避免静态方法,因为这有增加耦合和降低内聚的风险。
- 至于你的问题,你最好使用 CardLayout 并将新的 JPanel 添加到 CardLayout-using 容器中,JPanel 位于 SOUTH,但隐藏,比如被 JLabel 覆盖,该 JLabel 也被添加到相同的 CardLayout-using 容器并且正在显示。这样,容器(使用 CardLayout 的南部 JPanel)的大小将被调整以容纳它包含的所有 "cards",只要在 gui 创建时添加 "card" 组件。