I have a problem with a JList. When I select an item, it resizes itself. How can I set the JList to a fixed size?
Here is a screenshot before I selected anything
and this is after
Here is my code:
public class AgendaView extends JFrame {
private JLabel firstNameLabel, lastNameLabel, adressLabel, phoneNumberLabel, extraInfoLabel;
private Button editButton, addButton, deleteButton, showButton;
private JPanel labels, gui, buttons;
private DefaultListModel model;
private JList list;
private JMenuBar menuBar;
private JMenu menu;
private JMenuItem newItem, saveItem, saveAsItem, exitItem, openItem;
private Agenda agenda;
private JScrollPane scrollPane;
public AgendaView() {
super("***Agenda View***");
menuBar = new JMenuBar();
menu = new JMenu("Menu");
menu.add(new JSeparator());
newItem = new JMenuItem("New");
saveItem = new JMenuItem("Save");
saveItem.setEnabled(false);
saveAsItem = new JMenuItem("Save as..");
saveAsItem.setEnabled(false);
exitItem = new JMenuItem("Exit");
openItem = new JMenuItem("Open");
saveItem.add(new JSeparator());
exitItem.add(new JSeparator());
menu.add(newItem);
menu.add(openItem);
menu.add(saveItem);
menu.add(saveAsItem);
menu.add(exitItem);
gui = new JPanel(new BorderLayout(2, 2));
gui.setBorder(new TitledBorder("Owner"));
labels = new JPanel(new GridLayout(0, 1, 1, 1));
labels.setBorder(new TitledBorder("Contact "));
buttons = new JPanel(new GridLayout(1, 0, 1, 1));
editButton = new Button("Edit");
addButton = new Button("Add");
deleteButton = new Button("Delete");
showButton = new Button("Show");
editButton.setEnabled(false);
addButton.setEnabled(false);
deleteButton.setEnabled(false);
showButton.setEnabled(false);
buttons.add(showButton);
buttons.add(editButton);
buttons.add(addButton);
buttons.add(deleteButton);
firstNameLabel = new JLabel("First name: ");
lastNameLabel = new JLabel("Last name: ");
adressLabel = new JLabel("Adress: ");
phoneNumberLabel = new JLabel("Phone number: ");
extraInfoLabel = new JLabel("Extra info: ");
labels.add(firstNameLabel);
labels.add(lastNameLabel);
labels.add(adressLabel);
labels.add(phoneNumberLabel);
labels.add(extraInfoLabel);
model = new DefaultListModel();
list = new JList(model);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setVisibleRowCount(-1);
list.addListSelectionListener(
new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent lse) {
String name = list.getSelectedValue().toString();
String[] split = name.split(" ");
Contact contact = agenda.searchContactbyName(split[0], split[1]);
firstNameLabel.setText("First name: " + contact.getFirstName());
lastNameLabel.setText("Last name: " + contact.getLastName());
adressLabel.setText("Adress: " + contact.getAdress());
phoneNumberLabel.setText("Phone number: " + contact.getPhoneNumber());
if (contact.getType().compareTo("Acquaintance") == 0) {
extraInfoLabel.setText("Occupation: " + contact.getExtraInfo());
} else if (contact.getType().compareTo("Colleague") == 0) {
extraInfoLabel.setText("Email: " + contact.getExtraInfo());
} else if (contact.getType().compareTo("Friend") == 0) {
extraInfoLabel.setText("Birthdate: " + contact.getExtraInfo());
} else {
extraInfoLabel.setVisible(false);
}
}
});
scrollPane = new JScrollPane(list);
gui.add(labels, BorderLayout.CENTER);
gui.add(scrollPane, BorderLayout.WEST);
gui.add(buttons, BorderLayout.SOUTH);
add(gui);
menuBar.add(menu);
setJMenuBar(menuBar);
Here is where I display the GUI:
public class JavaLab3_pb1Java {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws FileNotFoundException, IOException {
Agenda agenda = new Agenda();
AgendaView agendaView = new AgendaView();
agendaView.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
agendaView.setSize(500, 300);
agendaView.pack();
agendaView.setVisible(true);
}
}
JList is part of Java Swing package . JList is a component that displays a set of Objects and allows the user to select one or more items . JList inherits JComponent class.
JList doesn't support scrolling directly. To create a scrolling list you make the JList the viewport view of a JScrollPane.
You need to call pack()
on your JFrame after adding all components and before calling setVisible(true)
on it. This will tell the GUI's layout managers to manage their layouts, and will resize the GUI to the preferred size as specified by the components and the layouts.
Edit
Never call setSize(...)
on anything. Better to override getPreferredSize()
. For example, my sscce:
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
public class AgendaView extends JFrame {
private static final int PREF_W = 500;
private static final int PREF_H = 300;
private JLabel firstNameLabel, lastNameLabel, adressLabel, phoneNumberLabel,
extraInfoLabel;
private JButton editButton, addButton, deleteButton, showButton;
private JPanel labels, gui, buttons;
private DefaultListModel<String> model;
private JList<String> list;
private JScrollPane scrollPane;
public AgendaView() {
super("***Agenda View***");
gui = new JPanel(new BorderLayout(2, 2));
gui.setBorder(new TitledBorder("Owner"));
labels = new JPanel(new GridLayout(0, 1, 1, 1));
labels.setBorder(new TitledBorder("Contact "));
buttons = new JPanel(new GridLayout(1, 0, 1, 1));
editButton = new JButton("Edit");
addButton = new JButton("Add");
deleteButton = new JButton("Delete");
showButton = new JButton("Show");
editButton.setEnabled(false);
addButton.setEnabled(false);
deleteButton.setEnabled(false);
showButton.setEnabled(false);
buttons.add(showButton);
buttons.add(editButton);
buttons.add(addButton);
buttons.add(deleteButton);
firstNameLabel = new JLabel("First name: ");
lastNameLabel = new JLabel("Last name: ");
adressLabel = new JLabel("Adress: ");
phoneNumberLabel = new JLabel("Phone number: ");
extraInfoLabel = new JLabel("Extra info: ");
labels.add(firstNameLabel);
labels.add(lastNameLabel);
labels.add(adressLabel);
labels.add(phoneNumberLabel);
labels.add(extraInfoLabel);
model = new DefaultListModel<String>();
list = new JList<String>(model);
String[] eles = { "Ciprian Aftode", "Andrei Batinas", "Bogdan Fichitiu",
"Valentin Pascau" };
for (String ele : eles) {
model.addElement(ele);
}
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// list.setVisibleRowCount(-1);
list.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent lse) {
firstNameLabel.setText("First name: first name");
lastNameLabel.setText("Last name: last name");
adressLabel.setText("Address: Address");
phoneNumberLabel.setText("Phone number: PhoneNumber");
extraInfoLabel.setText("Occupation: ExtraInfo");
}
});
int ebGap = 8;
list.setBorder(BorderFactory.createEmptyBorder(ebGap, ebGap, ebGap, ebGap));
scrollPane = new JScrollPane(list);
gui.add(labels, BorderLayout.CENTER);
gui.add(scrollPane, BorderLayout.WEST);
gui.add(buttons, BorderLayout.SOUTH);
add(gui);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
private static void createAndShowGui() {
AgendaView frame = new AgendaView();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With