【问题标题】:JList java resizeJList java调整大小
【发布时间】:2013-03-05 23:50:37
【问题描述】:

我对 JList 有疑问。当我选择一个项目时,它会自行调整大小。如何将 JList 设置为固定大小?

这是我选择任何内容之前的屏幕截图

这是在

之后

这是我的代码:

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);

    }
}

【问题讨论】:

  • 没有通用布局和监听器的代码很难分辨。
  • 我认为JScrollPane 将解决此问题,将您的列表添加到JScrollPane 并将滚动窗格添加到框架中。或者你可以做frame.add(new JScrollPane(list));
  • 我相信如果在显示窗口或填充你调用 repaint() 的 gui 之后;你会看到它很小,因为你的布局设置不正确,所以我猜你调用 list.setSize(...);,所以下一次重绘(在你的情况下由选择触发)将强制布局大小,所以示例布局和列表的代码应该可以解决疑惑,然后我们可以提供帮助。
  • 1) 不要无故混用 Swing(例如 JFrame)和 AWT(例如 Button)组件。在这种情况下,请使用JButton。 2) 为了尽快获得更好的帮助,请发帖SSCCE
  • 另外,是什么让您认为list.setVisibleRowCount(-1); 是个好主意?

标签: java swing jlist


【解决方案1】:

您需要在添加所有组件之后和在其上调用 setVisible(true) 之前在 JFrame 上调用 pack()。这将告诉 GUI 的布局管理器管理其布局,并将 GUI 调整为组件和布局指定的首选大小。

编辑
切勿在任何事情上致电setSize(...)。最好覆盖getPreferredSize()。比如我的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();
         }
      });
   }

}

【讨论】:

  • @CosminAcostachioaei:请显示您尝试执行此操作的位置,因为我在您上面发布的代码中看不到它。其实用上面的代码创建的 GUI 是在哪里显示的呢?
  • @CosminAcostachioaei:永远不要使用seSize(...),因为那是你问题的根源。 setPreferredSize(...) 可以工作,但最好覆盖 getPreferredSize()
  • @CosminAcostachioaei:请参阅编辑以回答例如我的意思。感谢您发布您的代码,但下一次,请发布 sscce 而无需我们请求。否则你会强迫我们猜测哪个不是很有趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
相关资源
最近更新 更多