如何从多个GUI类集成多页Java桌面应用程序
我正在从事一个JavaSwing桌面应用程序项目。该应用程序大约有15个GUI页面。我可以使用分层窗格和选项卡窗格将所有GUI组件放在一个类中。但这一类将是巨大的。如果我可以将项目分成几个较小的子项目,并让每个子项目都有一个或几个GUI页面,这将是一个好主意。我可以单独处理每个子项目,并在所有子项目完成后将它们重新集成到一个应用程序中。 我的问题是,如何集成来自不同类的所有GUI页面,以便在单击按钮时返回并强制在不同页面之间切换?由于子项目包含GUI页面,因此每个项目都需要一个JFrame。如何在JFrame 1和JFrame 2之间切换并强制,使一个可见,另一个不可见?如何从多个GUI类集成多页Java桌面应用程序,java,swing,user-interface,layout-manager,cardlayout,Java,Swing,User Interface,Layout Manager,Cardlayout,我正在从事一个JavaSwing桌面应用程序项目。该应用程序大约有15个GUI页面。我可以使用分层窗格和选项卡窗格将所有GUI组件放在一个类中。但这一类将是巨大的。如果我可以将项目分成几个较小的子项目,并让每个子项目都有一个或几个GUI页面,这将是一个好主意。我可以单独处理每个子项目,并在所有子项目完成后将它们重新集成到一个应用程序中。 我的问题是,如何集成来自不同类的所有GUI页面,以便在单击按钮时返回并强制在不同页面之间切换?由于子项目包含GUI页面,因此每个项目都需要一个JFrame。如何
演示如何创建新的JFrames。但是没有显示如何在JFrames之间来回切换。您有两个选项:
希望这有帮助 您的集中式控制器想法不错 就我个人而言,我的第一个想法是尝试将这些单独的页面分组为域组(或责任组)。这将给我第一级的控制。我将决定用户如何使用这些域 一旦你完成了这项工作,你就可以进入下一个层次,即哪些组彼此工作(如果有的话)&你希望用户如何与这些组交互 等等 我同意HovercraftFullOfEels,你不想向用户扔很多窗口,这只会让他们感到沮丧,你也不想让他们在相关页面之间切换,其中一个页面上的信息对另一个页面有用 你可能会发现你最终将两者结合起来。也就是说,您可能需要为用户提供在框架中打开某些页面的灵活性。这将使他们能够决定他们总是需要什么信息&他们可以翻阅什么信息 伊姆霍 。。。该应用程序大约有15个GUI页面。我可以使用分层窗格和选项卡窗格将所有GUI组件放在一个类中。但这一类将是巨大的 不一定。GUI可以非常简单,并且可以有一个允许其他类添加页面的方法,比如称为
registerPage(…)
:
然后给出类方法,允许一个人转到下一个或上一个页面或随机页面。例如,像这样小的类可以工作:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class LotsOfPagesPanel extends JPanel {
private CardLayout cardlayout = new CardLayout();
private JPanel pageHolder = new JPanel(cardlayout);
private DefaultComboBoxModel<String> nameComboModel = new DefaultComboBoxModel<String>();
private JComboBox<String> nameCombo = new JComboBox<String>(nameComboModel);
public LotsOfPagesPanel() {
JPanel btnPanel = new JPanel(new GridLayout(1, 0, 5, 0));
btnPanel.add(new JButton(new PrevAction(this, "Previous", KeyEvent.VK_P)));
btnPanel.add(new JButton(new NextAction(this, "Next", KeyEvent.VK_N)));
JPanel bottomPanel = new JPanel();
bottomPanel.add(btnPanel);
bottomPanel.add(nameCombo);
nameCombo.addActionListener(new NameComboListener());
pageHolder.setBorder(BorderFactory.createEtchedBorder());
setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
setLayout(new BorderLayout(5, 5));
add(pageHolder, BorderLayout.CENTER);
add(bottomPanel, BorderLayout.PAGE_END);
}
public void previousPage() {
cardlayout.previous(pageHolder);
}
public void nextPage() {
cardlayout.next(pageHolder);
}
public void show(String name) {
cardlayout.show(pageHolder, name);
}
public void registerPage(JComponent page, String name) {
pageHolder.add(page, name);
nameComboModel.addElement(name);
}
private class NameComboListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String selection = nameCombo.getSelectedItem().toString();
show(selection);
}
}
}
和NextAction.java
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
public class NextAction extends AbstractAction {
private LotsOfPagesPanel lotsOfPages;
public NextAction(LotsOfPagesPanel lotsOfPages, String name, Integer keyCode) {
super(name);
this.lotsOfPages = lotsOfPages;
putValue(MNEMONIC_KEY, keyCode);
}
@Override
public void actionPerformed(ActionEvent e) {
lotsOfPages.nextPage();
}
}
当然,你需要有一个主要的方法:
import java.awt.Color;
import java.awt.Dimension;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
public class LotsOfPagesMain {
private static final String[] LABELS = { "One", "Two", "Three", "Four",
"Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve",
"Thirteen", "Fourteen", "Fifteen" };
private static final Dimension LABEL_SIZE = new Dimension(400, 300);
private static void createAndShowGui() {
LotsOfPagesPanel lotsOfPages = new LotsOfPagesPanel();
Random random = new Random();
// I'm using JLabels as a simple substitute for your complex JPanel GUI "pages"
for (String labelText : LABELS) {
JLabel label = new JLabel(labelText, SwingConstants.CENTER);
label.setPreferredSize(LABEL_SIZE);
label.setOpaque(true);
label.setBackground(new Color(random.nextInt(170) + 85, random
.nextInt(170) + 85, random.nextInt(170) + 85));
lotsOfPages.registerPage(label, labelText);
}
JFrame frame = new JFrame("LotsOfPages");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(lotsOfPages);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
但无论如何,它都不会是一个庞大的类,您也不必担心向用户翻转多个JFrames。您真的不应该向可怜的用户扔一堆JFrames。为什么不简单地使用CardLayout交换视图?@Hovercraft为什么多个JFrames GUI不好?它对程序有什么负面影响?当用户在单个JFrame上交换视图要好得多时,为什么让他翻转JFrame?CardLayout是解决这个问题的方法。有时,最好的答案不是解决原始海报的要求,而是为他们的程序行为提供更好的解决方案。
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
public class NextAction extends AbstractAction {
private LotsOfPagesPanel lotsOfPages;
public NextAction(LotsOfPagesPanel lotsOfPages, String name, Integer keyCode) {
super(name);
this.lotsOfPages = lotsOfPages;
putValue(MNEMONIC_KEY, keyCode);
}
@Override
public void actionPerformed(ActionEvent e) {
lotsOfPages.nextPage();
}
}
import java.awt.Color;
import java.awt.Dimension;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
public class LotsOfPagesMain {
private static final String[] LABELS = { "One", "Two", "Three", "Four",
"Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve",
"Thirteen", "Fourteen", "Fifteen" };
private static final Dimension LABEL_SIZE = new Dimension(400, 300);
private static void createAndShowGui() {
LotsOfPagesPanel lotsOfPages = new LotsOfPagesPanel();
Random random = new Random();
// I'm using JLabels as a simple substitute for your complex JPanel GUI "pages"
for (String labelText : LABELS) {
JLabel label = new JLabel(labelText, SwingConstants.CENTER);
label.setPreferredSize(LABEL_SIZE);
label.setOpaque(true);
label.setBackground(new Color(random.nextInt(170) + 85, random
.nextInt(170) + 85, random.nextInt(170) + 85));
lotsOfPages.registerPage(label, labelText);
}
JFrame frame = new JFrame("LotsOfPages");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(lotsOfPages);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}