gpt4 book ai didi

java - 根据 JList 值将 JButton 动态添加到 JPanel

转载 作者:太空宇宙 更新时间:2023-11-04 14:01:20 25 4
gpt4 key购买 nike

我正在开发 Java Swing 应用程序。我的要求:-

在我的 JFrame 中,我有一个值为“一”、“二”、“三”等的 JList。当我选择一个列表项时,我想显示“n”个按钮,其中“n”是所选的值。

示例:-如果我从列表中选择“三”,则 JFrame 中应该有 3 个按钮。

下面是我的代码:-

public class Details extends JFrame {

String[] navData = new String{"One","Two","Three","Four"};
private JPanel contentPane;

/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Details frame = new Details();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame.
*/

public Details() {

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
Toolkit tk = Toolkit.getDefaultToolkit();
int xSize = ((int) tk.getScreenSize().getWidth());
int ySize = ((int) tk.getScreenSize().getHeight());
//frame.setSize(xSize,ySize);
setTitle("Test");
setBounds(0, 0, 776, 457);
setResizable(false);
//setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);

final JList list = new JList(navData);
list.setBounds(0, 0, 140, ySize);
contentPane.add(list);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setFixedCellHeight(50);
list.setFixedCellWidth(70);
list.setBorder(new EmptyBorder(10,10, 10, 10));


list.addListSelectionListener(new ListSelectionListener() {

@Override
public void valueChanged(ListSelectionEvent arg0) {

int numButtons;
String selectedItem = navData[list.getSelectedIndex()];
switch (selectedItem) {
case "One":
addButtons(1);
break;
case "Two":
addButtons(2);
break;
case "Three":
addButtons(3);
break;
case "Four":
addButtons(4);
break;
default:
break;
}

}
});
list.setSelectedIndex(0);


}

public void addButtons(int n)
{
revalidate();
for(int i = 0; i<n;i++)
{
JButton button = new JButton(" "+navData[i]);
button.setBounds(200 + (i*50), 150, 50, 50);
contentPane.add(button);
}

}
}

- 问题:-

当我更改列表中的选定项目时,JPanel 没有更新。换句话说,当我从列表中选择“三”时,我没有看到 3 个按钮。我只得到 1 个由默认选择创建的按钮。

最佳答案

我做了这些更改:

  1. 我将 JList 放在一个 JPanel 中,将 JButton 放在另一个 JPanel 中。

  2. 我对 JList JPanel 使用了 FlowLayout,对 JButtons JPanel 使用了 FlowLayout。如果您愿意,您可以随意更改这些 Swing 布局。

  3. 我将默认值更改为 4 个按钮,因此 JFrame 可以正确打包最多 4 个 JButton。

  4. 在尝试将 JButton 添加到 JPanel 之前,我添加了一种从 JPanel 中删除 JButton 的方法。

  5. 我重新验证并重新绘制了 JButton JPanel。

代码如下:

package com.ggl.testing;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListSelectionModel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class Details extends JFrame {

private static final long serialVersionUID = -555805219508469709L;

private String[] navData = { "One", "Two", "Three", "Four" };

private JPanel buttonPanel;

/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Details frame = new Details();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame.
*/

public Details() {
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setTitle("Test");

buttonPanel = new JPanel();

JPanel listPanel = new JPanel();
final JList<String> list = new JList<String>(navData);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setFixedCellHeight(50);
list.setFixedCellWidth(70);
list.setBorder(new EmptyBorder(10, 10, 10, 10));

list.addListSelectionListener(new ListSelectionListener() {

@Override
public void valueChanged(ListSelectionEvent event) {

String selectedItem = navData[list.getSelectedIndex()];
switch (selectedItem) {
case "One":
removeButtons(buttonPanel);
addButtons(buttonPanel, 1);
break;
case "Two":
removeButtons(buttonPanel);
addButtons(buttonPanel, 2);
break;
case "Three":
removeButtons(buttonPanel);
addButtons(buttonPanel, 3);
break;
case "Four":
removeButtons(buttonPanel);
addButtons(buttonPanel, 4);
break;
default:
break;
}

}
});
list.setSelectedIndex(3);

listPanel.add(list);

add(listPanel, BorderLayout.WEST);
add(buttonPanel, BorderLayout.CENTER);

pack();
}

public void removeButtons(JPanel panel) {
Component[] components = panel.getComponents();
for (int i = 0; i < components.length; i++) {
panel.remove(components[i]);
}
}

public void addButtons(JPanel panel, int n) {
for (int i = 0; i < n; i++) {
JButton button = new JButton(navData[i]);
panel.add(button);
}
panel.revalidate();
panel.repaint();
}
}

关于java - 根据 JList 值将 JButton 动态添加到 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29285226/

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