强制两个JList在Java Swing中具有相同的大小?

问题描述 投票:1回答:1

我正在尝试制作一个在两个JList之间交换项目的JavaSwing组件。工作正常。但是,当一个列表中的某个项目较长时,它将更改大小以适合文本。我不希望这种情况发生。我已经将JScrollBar添加到每个JLists中,如果我调整Window的大小,它们就会出现。但我希望列表的大小保持不变。

Here's a screenshot of my project.我无法避免注意到垂直Jpanel的大小会影响JList的绘制方式。请参阅第三个屏幕截图,该面板较小并且可以正常工作。

这里有一些代码,您可以对其进行测试。尝试将每个长条目移动到一张表中,然后看看会发生什么。

package table.resize.problem;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
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.SwingUtilities;

/**
 * @author theasdas
 */
public class TableResizeProblem {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                MainFrame window = new MainFrame();
            }
        });
    }
}

class MainFrame extends JFrame {

    //components:
    private JList list1 = new JList();
    private JList list2 = new JList();
    private DefaultListModel model1 = new DefaultListModel();
    private DefaultListModel model2 = new DefaultListModel();
    private JButton btnMove = new JButton("Move");
    //variables:
    private int selectedList = 0; //defines which list is focused by the user

    /**
     * Constructor.
     */
    public MainFrame() {
        //initial configuration
        configureSelf();
        configureComponents();
        setListeners();
        placeComponents();
        this.setVisible(true);
    }

    /**
     * Configure this component.
     */
    private void configureSelf() {
        this.setLayout(new GridBagLayout());
        this.setSize(600, 800);
    }

    /**
     * Configure other components.
     */
    private void configureComponents() {
        //lists
        list1.setModel(model1);
        list2.setModel(model2);
        //models
        for (int i = 0; i < 4; i++) {
            model1.addElement("item " + (i + 1));
            model1.addElement("looooong item" + (i + 1));
        }
        for (int i = 0; i < 4; i++) {
            model2.addElement("item " + (i + 1));
            model2.addElement("looooong item" + (i + 1));
        }
        //button
        btnMove.setEnabled(false);
    }

    private void setListeners() {

        //list focus listener
        FocusListener onFocus = new FocusListener() {
            @Override
            public void focusGained(FocusEvent fe) {
                checkFocus((JList) fe.getSource());
            }

            @Override
            public void focusLost(FocusEvent fe) {
                //do nothing
            }
        };
        //add listener to lists
        this.list1.addFocusListener(onFocus);
        this.list2.addFocusListener(onFocus);

        //button action listener
        ActionListener onClick = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                swapItem();
            }
        };
        this.btnMove.addActionListener(onClick);
    }

    /**
     * Checks which list is focused.
     *
     * @param list
     */
    private void checkFocus(JList list) {

        if (list == list1) {
            list2.clearSelection();
            selectedList = 1;
            btnMove.setEnabled(true);
        } else {
            list1.clearSelection();
            selectedList = 2;
            btnMove.setEnabled(true);
        }
    }

    /**
     * Swap an item between lists.
     */
    private void swapItem() {

        if (selectedList == 0 && (list1.getSelectedValue() == null || list2.getSelectedValue() == null)) {
            JOptionPane.showMessageDialog(new JPanel(), "Bruh...", "Bruh moment has been achieved.", JOptionPane.ERROR_MESSAGE);
            return;
        } else {
            if (selectedList == 1) {
                model2.addElement(list1.getSelectedValue());
                model1.removeElement(list1.getSelectedValue());
            } else {
                model1.addElement(list2.getSelectedValue());
                model2.removeElement(list2.getSelectedValue());
            }
        }
        selectedList = 0;
    }

    /**
     * Places components in a grid.
     */
    private void placeComponents() {
        GridBagConstraints g = new GridBagConstraints();

        //(0, 0) list1
        g.gridx = 0;
        g.gridy = 0;
        g.weightx = 1;
        g.weighty = 1;
        g.anchor = GridBagConstraints.PAGE_START;
        g.fill = GridBagConstraints.BOTH;
        g.insets = new Insets(5, 5, 5, 5);
        this.add(list1, g);
        //(1, 0) list 2
        g.gridx = 1;
        this.add(list2, g);
        //(0, 1) button
        g.gridx = 0;
        g.gridy = 1;
        g.fill = GridBagConstraints.HORIZONTAL;
        g.weighty = 0;
        g.gridwidth = GridBagConstraints.REMAINDER;
        this.add(btnMove, g);
    }

}

所以,我缺少什么?

java swing jlist dimension
1个回答
0
投票

尝试以下操作。我做了一些更改。

  • 扩展JFrame不是一个好主意。因此,我扩展了JPanel并将其添加到框架中。
  • 我使每个JList足够大,可以并排放置,也可以在按钮的底部留出足够的空间。
  • 并且您的JList和Model是通用类型,所以我也添加了它们。使用BorderLayout似乎可以正常工作。
  • 我还覆盖了JLists的getInsets,并添加了一个边框来描绘它们。

我还在代码中添加了一些注释。如果这没有达到您的预期效果,请告诉我。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

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.SwingUtilities;
import javax.swing.border.LineBorder;

/**
 * @author theasdas
 */
public class TableResizeProblem {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                MainFrame window = new MainFrame();
            }
        });
    }
}

class MainFrame extends JPanel {

    //components:
    JFrame frame = new JFrame();

    private JList<String> list1 = new JList<>() {
        public Insets getInsets() {
            return new Insets(5,5,5,5);
        }
    };
    private JList<String> list2 = new JList<>() {
        public Insets getInsets() {
            return new Insets(5,5,5,5);
        }
    };

    private DefaultListModel<String> model1 = new DefaultListModel<>();
    private DefaultListModel<String> model2 = new DefaultListModel<>();
    private JButton btnMove = new JButton("Move");
    //variables:
    private int selectedList = 0; //defines which list is focused by the user

    /**
     * Constructor.
     */
    public MainFrame() {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(this);
        setLayout(new BorderLayout());
        list1.setPreferredSize(new Dimension(300,600));
        list2.setPreferredSize(new Dimension(300,600));


        list1.setBorder(new LineBorder(Color.black));
        list2.setBorder(new LineBorder(Color.black));
        add(list1,BorderLayout.WEST);
        add(list2,BorderLayout.EAST);
        add(btnMove,BorderLayout.SOUTH);
        configureComponents();
        setListeners();
        // pack the frame and invoke the layouts
        frame.pack();
        // center the frame on the screen.
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }


    /**
     * Configure other components.
     */
    private void configureComponents() {
        //lists
        list1.setModel(model1);
        list2.setModel(model2);
        //models
        for (int i = 0; i < 4; i++) {
            model1.addElement("item " + (i + 1));
            model1.addElement("looooong item" + (i + 1));
        }
        for (int i = 0; i < 4; i++) {
            model2.addElement("item " + (i + 1));
            model2.addElement("looooong item" + (i + 1));
        }
        //button
        btnMove.setEnabled(false);
    }

    private void setListeners() {

        //list focus listener
        FocusListener onFocus = new FocusListener() {
            @Override
            public void focusGained(FocusEvent fe) {
                checkFocus((JList<String>) fe.getSource());
            }

            @Override
            public void focusLost(FocusEvent fe) {
                //do nothing
            }
        };
        //add listener to lists
        this.list1.addFocusListener(onFocus);
        this.list2.addFocusListener(onFocus);

        //button action listener
        ActionListener onClick = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                swapItem();
            }
        };
        this.btnMove.addActionListener(onClick);
    }

    /**
     * Checks which list is focused.
     *
     * @param list
     */
    private void checkFocus(JList list) {

        if (list == list1) {
            list2.clearSelection();
            selectedList = 1;
            btnMove.setEnabled(true);
        } else {
            list1.clearSelection();
            selectedList = 2;
            btnMove.setEnabled(true);
        }
    }

    /**
     * Swap an item between lists.
     */
    private void swapItem() {

        if (selectedList == 0 && (list1.getSelectedValue() == null || list2.getSelectedValue() == null)) {
            JOptionPane.showMessageDialog(new JPanel(), "Bruh...", "Bruh moment has been achieved.", JOptionPane.ERROR_MESSAGE);
            return;
        } else {
            if (selectedList == 1) {
                model2.addElement(list1.getSelectedValue());
                model1.removeElement(list1.getSelectedValue());
            } else {
                model1.addElement(list2.getSelectedValue());
                model2.removeElement(list2.getSelectedValue());
            }
        }
        selectedList = 0;
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.