每当更新发生时,JList位置都会重置为默认值

时间:2015-10-29 00:39:56

标签: java swing jlist

list接受来自Action1的输入,但是,只要将新元素添加到列表中,列表的位置就会移回默认top-middle位置。

当帧的大小调整时也会发生这种情况,因此临时修复我的行frame.setResizable(false),但我不希望它是永久性的。

我如何解决这两个问题?

enter image description here

enter image description here

import static java.lang.String.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionListener;

public class lists 
{

static String newUrl;
static DefaultListModel<String> model = new DefaultListModel<String>();
static int listXCoord = 650;
static int listYCoord = 10;

public static void createGUI()
{

    JFrame frame = new JFrame();
    frame.setVisible(true);
    frame.setSize(800,600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);

    JPanel panel = new JPanel();
    frame.add(panel);

    JButton addurl = new JButton("Add URL");
    panel.add(addurl);
    addurl.addActionListener(new Action1());
    JButton remurl = new JButton("Remove URL");
    panel.add(remurl);


    //model.addElement("one");
    //model.addElement("two");
    //model.addElement("three");

    JList list = new JList<String>(model);
    list.setCellRenderer(new DefaultListCellRenderer());
    list.setVisible(true);
    list.setLocation(listXCoord, listYCoord);
    list.setBackground(new Color(186, 203, 250));
    //list.setLocation(650, 10);


    panel.add(list);
    list.setSize(130, 540);
}
static class Action1 implements ActionListener
{        
    public void actionPerformed (ActionEvent e) 
    {

        newUrl = JOptionPane.showInputDialog("Enter the URL to be Launched");
        model.addElement(newUrl);
    }
}   
public static void main(String[] args) 
{

    createGUI();

} 
}

1 个答案:

答案 0 :(得分:2)

基本上,你正在与布局管理器(Flowlayout)作斗争而失败。向JList添加新元素时,容器层次结构已重新验证,导致布局管理器重新布局其容器的内容

基本解决方案是使用不同的布局,但JFrame使用BorderLayout,因此您可以简单地将JList添加到JPanel,而不是EAST将其添加到框架的import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class Lists { static String newUrl; static DefaultListModel<String> model = new DefaultListModel<String>(); static int listXCoord = 650; static int listYCoord = 10; public static void createGUI() { JFrame frame = new JFrame(); frame.setSize(800, 600); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); frame.add(panel); JButton addurl = new JButton("Add URL"); panel.add(addurl); addurl.addActionListener(new Action1()); JButton remurl = new JButton("Remove URL"); panel.add(remurl); //model.addElement("one"); //model.addElement("two"); //model.addElement("three"); JList list = new JList<String>(model); list.setCellRenderer(new DefaultListCellRenderer()); list.setVisible(true); list.setLocation(listXCoord, listYCoord); list.setBackground(new Color(186, 203, 250)); //list.setLocation(650, 10); frame.add(new JScrollPane(list), BorderLayout.EAST); frame.setVisible(true); } static class Action1 implements ActionListener { public void actionPerformed(ActionEvent e) { newUrl = JOptionPane.showInputDialog("Enter the URL to be Launched"); model.addElement(newUrl); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } createGUI(); } }); } } 位置

Layout

setVisible

有关详细信息,请参阅Laying Out Components Within a ContainerHow to Use BorderLayoutHow to use FlowLayout

您应该最后调用JList,在将所有组件添加到框架后,这样可以减少您认为某些组件在显示时不会显示的可能性。

JScrollPane也将受益于rvest。有关详细信息,请参阅How to Use ListsHow to Use Scroll Panes