- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在这里进行研究并一直在寻找问题的解决方案。我是java新手,所以我不知道所有的语法。我正在尝试让我的代码从保存和加载菜单项的创建方法传输项目。 save 事件处理程序应调用 save() 方法并将右侧面板中的部件列表保存到 XML 文件中。 load 事件处理程序应调用方法 load(),并且应在右侧面板中显示未编码的数据。我对 JAXB 或 XML 都不熟悉。我试图看看其他人是否做过类似的事情,但我无法完成代码。有人可以帮我吗?下面是整个代码。我已经找到了使用事件处理程序使其退出的解决方案,但我陷入了编码和解编保存和加载菜单项的困境。
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
public class Window {
private final JFrame frame;
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
Window window = new Window();
window.frame.setVisible(true);
});
}
public Window() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
initialize();
}
public void initialize() {
//Creating the Panel for Menu Bar
JPanel panel = new JPanel();
panel.setBounds(0, 0, 434, 23);
frame.getContentPane().add(panel);
panel.setLayout(new BorderLayout(0, 0));
//Creating the Menu File Bar
JMenuBar bar = new JMenuBar();
panel.add(bar, BorderLayout.NORTH);
JMenu file = new JMenu("File");
JMenuItem load = new JMenuItem("Load");
JMenuItem save = new JMenuItem("Save");
JMenuItem exit = new JMenuItem("Exit");
file.add(load);
load.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
}
});
file.add(save);
save.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
}
});
file.add(exit);
exit.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});
bar.add(file);
//Populate Left List with part names
final DefaultListModel parts = new DefaultListModel();
parts.addElement("Case");
parts.addElement("Motherboard");
parts.addElement("CPU");
parts.addElement("GPU");
parts.addElement("PSU");
parts.addElement("RAM");
parts.addElement("HDD");
final JList leftList = new JList(parts);
leftList.setBounds(10, 26, 142, 224);
frame.getContentPane().add(leftList);
//create right list
final DefaultListModel partSelected = new DefaultListModel();
final JList rightList = new JList(partSelected);
rightList.setBounds(282, 26, 142, 224);
frame.getContentPane().add(rightList);
//add event to the button to move items from left list to right list
JButton btnNewButton = new JButton(">>");
btnNewButton.addActionListener((ActionEvent arg0) -> {
for (Object selectedValue : leftList.getSelectedValuesList()) {
partSelected.addElement(selectedValue);
parts.removeElement(selectedValue);
int iSelected = leftList.getSelectedIndex();
if (iSelected == -1) {
return;
}
}
});
btnNewButton.setBounds(172, 86, 89, 23);
frame.getContentPane().add(btnNewButton);
//Remove Button
JButton remove = new JButton("<<");
remove.addActionListener((ActionEvent arg0) -> {
for (Object selectedValue : rightList.getSelectedValuesList()) {
parts.addElement(selectedValue);
partSelected.removeElement(selectedValue);
int selected = rightList.getSelectedIndex();
if (selected == -1) {
return;
}
}
});
remove.setBounds(172, 140, 89, 23);
frame.getContentPane().add(remove);
}
}
最佳答案
好的,所以您首先需要了解 JAXB 旨在将对象序列化到 XML 或从 XML 序列化对象(通过使用注释)。
因此,您首先需要的是某种要序列化的对象,其中包含您的产品。一个ListModel
似乎是一个完美的选择,除了它不是为任务设置的,它没有注释,JAXB 可以通过注释来决定应该序列化或不序列化什么
所以,我们需要创建一个......
@XmlRootElement
public static class ProductListModel extends AbstractListModel<String> {
private List<String> products;
public ProductListModel() {
products = new ArrayList<>(25);
}
@XmlElementWrapper
public List<String> getProducts() {
return products;
}
public void add(String product) {
products.add(product);
fireIntervalAdded(this, products.size() - 1, products.size() - 1);
}
public void remove(String product) {
int index = products.indexOf(product);
products.remove(product);
fireIntervalAdded(this, index, index);
}
@Override
public int getSize() {
return products.size();
}
@Override
public String getElementAt(int index) {
return products.get(index);
}
}
(现在,您可能会说 ArrayList
之类的东西可能会更好,但我想说,这扩展了类(class),但几乎没有 yield ,甚至没有 yield ,并且当您尝试计算时,可能需要做更多的工作知道如何序列化它的缓冲区)
接下来,我们需要访问 rightList
initialize
之外方法,因为你的 load
和save
方法会想要这个。我们可以使用ListModel
,但是当我们加载它时,我们需要一些东西来将它应用到任何方式......
//...
private JList rightList;
public void initialize() {
//...
final ProductListModel parts = new ProductListModel();
parts.add("Case");
parts.add("Motherboard");
parts.add("CPU");
parts.add("GPU");
parts.add("PSU");
parts.add("RAM");
parts.add("HDD");
leftList = new JList(parts);
leftList.setBounds(10, 26, 142, 224);
frame.getContentPane().add(leftList);
//create right list
final ProductListModel partSelected = new ProductListModel();
//JList rightList = new JList(partSelected);
rightList = new JList(partSelected);
这也改变了 DefaultListModel
的使用至ProductListModel
。从技术上讲,这仅适用于 rightList
,但自从我更改了 add
和remove
ListModel
的方法名称(这将导致编译器错误,因此您需要更新它们),它只会让生活更轻松。
现在我们需要的是save
和load
方法...
protected void save() {
ProductListModel model = (ProductListModel) rightList.getModel();
try {
File file = new File("Products.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(ProductListModel.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
// output pretty printed
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(model, file);
jaxbMarshaller.marshal(model, System.out);
} catch (JAXBException exp) {
exp.printStackTrace();
}
}
protected void load() {
try {
File file = new File("Products.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(ProductListModel.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
ProductListModel model = (ProductListModel) jaxbUnmarshaller.unmarshal(file);
rightList.setModel(model);
} catch (JAXBException exp) {
exp.printStackTrace();
}
}
您需要从ActionListener
调用电话已注册到您的load
和save
JMenuItem
看看JAXB hello world example (我用来设计解决方案)和 Introduction to JAXB了解更多详情。
您可能还想看看 How to Use Lists , How to Use Scroll Panes和 Laying Out Components Within a Container帮助改进您的用户界面
现在,当您加载ProductList
时,您将需要弄清楚如何修改 leftList
删除现在出现在右侧的项目;)
关于java - 编码将 jlist 的菜单项保存到 XML 并解码加载菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31579019/
我有一个 JList 的自定义单元格渲染器,它在其中显示一个嵌套的 JList 和另一个显示按钮的自定义单元格渲染器。我遇到的问题是任何用户输入(例如鼠标点击按钮、滚动操作)都没有得到处理,嵌套的 J
所以,我有两个选项卡,两个选项卡都有 JList,并且都有一个存储数据的数组列表,现在我需要找到一种方法,可以将数据从一个选项卡中的一个 JList 复制到另一个选项卡中的另一个 JList。 谢谢
您好,我需要有关填充第二个 Jlist 的紧急帮助,我已成功从数据库填充第一个 Jlist,但在找到填充第二个 Jlist 的方法时遇到了巨大困难。 我愿意, 从 Jlist1 中选择,单击按钮,将所
我有两个 Jlist( block 列表和层列表),当我单击层列表中的不同项目时,我尝试更新 block 列表的值。由于某种原因它不起作用。这是我的代码: JButton openButton,
如何从 JList 中获取 3 个单独的字符串?如果我使用 model.elementAt ,我会得到字符串,但它们不会彼此分离。 数据如何存储在 JList 中? 我可以使用数组将数据彼此分开吗?
我正在尝试创建一个循环,将项目添加到 jlist,但是当我放入 actionlistener 时,它似乎没有这样做...... textFieldSearch.addActionListener(ne
美好的一天,我是窗口构建器的新手(64 位 mac eclipse,如果重要的话)。鉴于教程代码中的错误数量,我猜它最近已经更新了很多。 基本上,我有一个位于面板中的 jlist 中的项目列表,以及位
我一直在这里进行研究并一直在寻找问题的解决方案。我是java新手,所以我不知道所有的语法。我试图让我的代码使用 jlist 之间的按钮将项目从一个 jlist 传输到另一个 jlist。左侧列表包含开
我创建了一个菜单,其中有 4 个类(class)。我为每道菜创建了一个 Jlist,其中包含不同的元素。我如何知道让这些选定的项目显示在另一个包含 Jlist 的类中的另一个 Jlist 中。 最佳答
我有一个 MySQL 数据库,其中包含我想填充到我的 Java 程序中的 JList 中的数据。我有两个 JList,一个填充事件标题,第二个填充客人姓名。 我想要的是当用户单击任何事件标题时,第二个
这是我的代码。为什么这些值没有进入第二个 JList?此外,第二个 Jlist 不可见。所有导入均已到位,并且在以下代码中不可见: public class Gui extends JFrame {
我有以下代码在工作 made_list.setListData(original_list.getSelectedValues()); 这里made_list是一个JList,original_lis
这是任何人都可以轻松快速运行的代码,它显示了我的问题: import java.awt.Color; import java.awt.Component; import java.awt.EventQ
这个问题已经有答案了: How to clear a JList in Java? (4 个回答) 已关闭 9 年前。 我正在使用 jlist.removeall 删除 jlist 中的所有项目,但它
我有一个 JList,它将根据用户指向选定的 JList。它的作用就像一个监视器,将监视选定的 JList。当我实现自定义单元格渲染器并以编程方式执行诸如 this.list = getSelecte
我有一个工作得非常完美的自定义渲染器 - 我如何将它用作“绘图引擎”来生成与 JList 中生成的相同对象? 最佳答案 how can I use it as a "drawing engine" t
我的程序是基于API的。我有一个 JList 和一个有一些名称的模型。还有一个用于获取所选项目的 selectListener 和一个按钮,用于将该项目发送到另一个窗口,该窗口还有另一个这是我的第一个
请耐心等待。我有一个包含 3 个 JList 的 Denist 程序。添加患者的患者 JList、添加患者历史的历史 jlist 以及应与历史 jlist 和患者 jlist 链接的发票历史。我让他们
我在这里遇到了一个问题,我创建了一个actionListener,它的目的是创建一个随机的人类并将其添加到JList以显示在JScrollPane上。到目前为止,一切都很顺利,除了每当我单击 JBut
我正在尝试创建一个带有 JList 和按钮的表单我想要做的是从 JList 中选择一个项目,然后按下按钮以根据选择执行操作。但是,一旦点击按钮,JList 就会失去焦点,选择消失,导致按钮无法确定选择
我是一名优秀的程序员,十分优秀!