gpt4 book ai didi

java - JFrame 多次使用一个组件

转载 作者:行者123 更新时间:2023-11-30 04:01:35 24 4
gpt4 key购买 nike

我正在创建一个夹具程序。我有一个带有 CREATE 按钮的页面。当用户点击创建时,它会在下一页上添加一个新按钮。我怎样才能得到它,以便当用户点击 CREATE 时它会添加一个新按钮,并且之前的按钮向下移动 50 像素(例如)。

createFixtures.setLayout(null);     //Create a new fixture panel components
createPanelLabel.setBounds(160, 30, 500, 50);
createPanelLabel.setFont(new Font("TimesRoman", Font.PLAIN, 50));
createPanelLabel.setForeground(Color.WHITE);
southBar4.setBounds(0, 730, 500, 1);
northBar4.setBounds(0, 100, 500, 1);
backButton2.setBounds(20, 750, 150, 60);
createButton2.setBounds(320, 750, 150, 60);
sportLabel.setBounds(30, 150, 500, 40);
sportLabel.setFont(new Font("TimesRoman", Font.PLAIN, 35));
sportLabel.setForeground(Color.WHITE);
descriptionLabel.setBounds(30, 300, 500, 40);
descriptionLabel.setFont(new Font("TimesRoman", Font.PLAIN, 35));
descriptionLabel.setForeground(Color.WHITE);
dateLabel.setBounds(30, 450, 500, 40);
dateLabel.setFont(new Font("TimesRoman", Font.PLAIN, 35));
dateLabel.setForeground(Color.WHITE);
resultLabel.setBounds(30, 600, 500, 40);
resultLabel.setFont(new Font("TimesRoman", Font.PLAIN, 35));
resultLabel.setForeground(Color.WHITE);
sportDropDown.setBounds(250, 150, 200, 40);
descriptionField.setBounds(250, 300, 200, 100);
descriptionField.setFont(new Font("TimesRoman", Font.PLAIN, 20));
descriptionField.setLineWrap(true);
descriptionField.setWrapStyleWord(true);
createFixtures.add(southBar4);
createFixtures.add(northBar4);
createFixtures.add(createPanelLabel);
createFixtures.add(backButton2);
createFixtures.add(createButton2);
createFixtures.add(sportLabel);
createFixtures.add(descriptionLabel);
createFixtures.add(dateLabel);
createFixtures.add(resultLabel);
createFixtures.add(sportDropDown);
createFixtures.add(descriptionField);

container.add(fixtures, "2"); //Labels each panel with a number allowing me to call the number when switching panels also adds panels to main container
container.add(loginPanel, "3");
container.add(createFixtures, "4");
container.add(editFixtures, "5");
container.add(adminFixturesFootball, "6");
container.add(adminFixturesSwimming, "7");
container.add(adminFixturesTennis, "8");

createButton2.addActionListener(new ActionListener() { //Back button listener, switches back to ADMIN fixtures panel
@Override
public void actionPerformed(ActionEvent e) {
cardLayout.show(container, "6");
String descriptionText = descriptionField.getText();
fixtureDescButton.setText( descriptionText );
fixtureDescButton2.setText( descriptionText );
}
});

最佳答案

同样,您应该创建一个工厂方法来创建您的 JPanel。

即,

public JPanel createPanel(String buttonText, String dataOnPanel) {
JPanel panel = new JPanel();
JButton myButton = new JButton(buttonText);
myButton.addActionListener(new ButtonListener());
panel.add(myButton);
// add jtextarea if need be with the dataOnPanel String,...

return panel;
}
<小时/>

编辑
你问

What difference does this make?

您无法将单个组件添加到多个容器中,但您可以创建类似组件并将它们添加到多个容器中。使用工厂方法可以让您做到这一点。有关您的问题的更多详细信息,请考虑创建并发布 minimal, compilable, runnable example program .

<小时/>

顺便说一句,您似乎正在使用空布局并在组件上调用 setBounds(...) 。虽然对于新手来说,这似乎是创建复杂 GUI 的更好方法,但这是一个谬论,您创建 Swing GUI 的次数越多,您就越学会尊重和使用布局管理器,并且会发现这些生物对创建灵活、美观和实用的界面有很大帮助。需要复杂的 GUI。

<小时/>

编辑2
注意:如果组件有足够显着的独特行为,那么我同意nachokk,创建一个类来封装它,然后创建这个类的实例而不是一个简单的工厂方法。

<小时/>

编辑3

关键是,虽然您不能向容器多次添加组件,但您可以多次添加使用相同模型的新组件,这几乎是同一件事。您的组件的组件甚至可以共享相同的模型,例如,如果需要,您的 JButton 可以共享相同的操作,您的 JTextField 可以共享相同的文档。

<小时/>

编辑4您声明:

A way to increment a button down every time the user hits CREATE. So it adds another button each time, but they move down each instead off spawning on the same position.

这里布局管理器是关键。包含 JPanel 和按钮的容器需要使用布局管理器,该管理器将接受新的 JPanel 并将其放置在正确的位置。考虑:

  • 接受新 JPanel 的容器可以使用 GridLayout(0, 1) —— 这意味着具有一列和可变行数的网格。
  • 使用 JPanel 将此 GridLayout 放置到使用 JPanel 的 BorderLayout 的 BorderLayout.NORTH 位置。这会将网格面板压缩到最小的合理尺寸,这样 JPanel 就不会扩展。
  • 使用 JPanel 将 BorderLayout 放入 JScrollPane 中。
  • 当您添加新的 JPanel 时,请使用 JPanel 将其添加到 GridLayout,然后使用 JPanel 在 GridLayout 上调用 revalidate()repaint(),以便新的 JPanel 将定位得很好。
  • 再次强调,有关您的问题的更多详细信息,请考虑创建并发布 minimal, compilable, runnable example program .
<小时/>

编辑5
比如我的MCVE :

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;

import javax.swing.*;

@SuppressWarnings("serial")
public class GridButtons extends JPanel {
private JPanel gridPanel = new JPanel(new GridLayout(0, 1));

public GridButtons() {
JPanel topPanel = new JPanel();
topPanel.add(new JButton(new AddRowAction("Add Row")));

JPanel middlePanel = new JPanel(new BorderLayout());
middlePanel.add(gridPanel, BorderLayout.NORTH);
JScrollPane scrollpane = new JScrollPane(middlePanel);
scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scrollpane.setPreferredSize(new Dimension(400, 400));

setLayout(new BorderLayout());
add(topPanel, BorderLayout.NORTH);
add(scrollpane, BorderLayout.CENTER);
}

private class AddRowAction extends AbstractAction {

public AddRowAction(String name) {
super(name);
}

@Override
public void actionPerformed(ActionEvent e) {
// my factory method here
JPanel panel = new JPanel();
panel.add(new JButton("Button"));
panel.add(new JTextField(20));
gridPanel.add(panel);
gridPanel.revalidate();
gridPanel.repaint();
}

}

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

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

关于java - JFrame 多次使用一个组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21882638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com