gpt4 book ai didi

java - JList 不显示在 JScrollPane 上

转载 作者:行者123 更新时间:2023-12-01 12:25:08 24 4
gpt4 key购买 nike

我正在尝试使用 JFilechooser 打开一个文本文件并将字符串放入 JList 中。我认为所有字符串都会进入列表,但我不知道为什么这些字符串没有出现在 JScrollPane 上。分组布局有问题吗?我不知道要改变什么..

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.util.*;
import java.util.List;

public class WordFinder extends JFrame implements ActionListener {

private WordList words = new WordList();

private JScrollPane scroll;
private JLabel label;
private JLabel word;
private JTextField textArea;
private JButton button;

private JMenuBar menuBar;
private JMenu menu;
private JMenuItem menuItem, menuItem2;

private JFileChooser fc;

private JList list;


static private final String newline = "\n";

private int lineCount;



public WordFinder() {
super("Word Finder");

fc = new JFileChooser();
fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);

menuBar = new JMenuBar();
menu = new JMenu("File");
menuBar.add(menu);

menuItem = new JMenuItem("Open...");
menuItem.addActionListener(this);

menuItem2 = new JMenuItem("Exit");
menuItem2.addActionListener(this);

menu.add(menuItem);
menu.add(menuItem2);
setJMenuBar(menuBar);

label = new JLabel("Find: ");

word = new JLabel(lineCount + " words total");

textArea = new JTextField();
textArea.setEditable(true);
textArea.setPreferredSize(new Dimension(200, 20));


button = new JButton("Clear");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
textArea.setText("");
}
});

scroll = makeListView();
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scroll.setPreferredSize(new Dimension(200, 230));

GroupLayout layout = new GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);

layout.setHorizontalGroup(layout.createSequentialGroup()
.addComponent(label)
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(textArea)
.addComponent(word)
.addComponent(scroll))
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(button)));

layout.setVerticalGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(label)
.addComponent(textArea)
.addComponent(button))
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(word))
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING))
.addComponent(scroll));

setVisible(true);
pack();
// call System.exit() when user closes the window
setDefaultCloseOperation(EXIT_ON_CLOSE);

}


private JScrollPane makeListView() {
// String[] labels = {"1", "2", "3"};
// list = new JList(labels);

JScrollPane listScroller = new JScrollPane(list);
return listScroller;
}

private void updateListView(DefaultListModel listModel) {
list = new JList(listModel);
scroll = new JScrollPane(list);
}

public void actionPerformed(ActionEvent e) {

DefaultListModel listModel = new DefaultListModel();

if (e.getSource() == menuItem) {
int returnVal = fc.showOpenDialog(WordFinder.this);

if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
String fileName = file.getAbsolutePath();

try {
FileReader files = new FileReader(fileName);
BufferedReader br = new BufferedReader(files);

String str;
while((str = br.readLine()) != null) {
listModel.addElement(str);
//System.out.println(str);
lineCount++;
}
System.out.println(lineCount);

updateListView(listModel);
br.close();
} catch (Exception ex) {
ex.printStackTrace(System.out);
System.out.println("can't read file");
}

System.out.println("Opening: " + file.getName() + newline);
}
} else if (e.getSource() == menuItem2) {
setVisible(false);
dispose();
}
}


/**
* Main method. Makes and displays a WordFinder window.
* @param args Command-line arguments. Ignored.
*/
public static void main(String[] args) {
// In general, Swing objects should only be accessed from
// the event-handling thread -- not from the main thread
// or other threads you create yourself. SwingUtilities.invokeLater()
// is a standard idiom for switching to the event-handling thread.
SwingUtilities.invokeLater(new Runnable() {
public void run () {
// Make and display the WordFinder window.
new WordFinder();
}
});
}
}

最佳答案

当您调用makeListView时,JListnull,因为它尚未初始化......因此,您基本上是在说scroll = new JScrollPane(null);...这不是特别有用...

接下来,当您调用 updateListView 时,您将创建 JListJScrollPane 的新实例,并且不对它们执行任何操作...

private void updateListView(DefaultListModel listModel) {
list = new JList(listModel);
scroll = new JScrollPane(list);
}

所以它们永远不会显示在屏幕上...

要纠正此问题,您需要进行一些修改...

  1. 在创建 JScrollPane 之前,创建 JList 的实例并将其分配给实例字段 list
  2. 无需创建 listscroll 的新实例,只需使用 JList#setModel

您可能还想看看Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

使用 JList,您可以通过使用 JList#setVisibleRowCount 影响 JScrollPane 的大小。和 JList#setPrototypeCellValue

关于java - JList 不显示在 JScrollPane 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26421548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com