我正在尝试制作一个在两个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);
}
}
所以,我缺少什么?
尝试以下操作。我做了一些更改。
BorderLayout
似乎可以正常工作。我还在代码中添加了一些注释。如果这没有达到您的预期效果,请告诉我。
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;
}
}