【发布时间】:2021-06-29 12:26:33
【问题描述】:
我想在一个新的 JDialog 中设置一个 ArrayList 内容的 JTable。我调试了代码,表模型设置了列和行,但 JDialog 没有显示任何内容。我检查了类似的问题,他们都指出setVisible(true) 应该在最后。就我而言,它已经是。如何在该 JDialog 中显示 JTable(包括来自 ArrayList 的数据 - 该部分应该已经在工作),基本上它目前是空的,根本没有表。
public class Main {
public static void main(String[] args) {
MainWindow wnd = new MainWindow();
}
}
public class MainWindow extends JFrame implements ActionListener {
private List<Movie> movies = new ArrayList<Movie>();
// Създаване на променливи за отделните контроли
private JLabel label1;
private JTextField tf1;
private JLabel label2;
private JTextField tf2;
private JLabel label3;
private JTextField tf3;
private JLabel label4;
private JComboBox combo1;
private JLabel label5;
private JTextField tf5;
private JButton btn1;
private JButton btn2;
public MainWindow() {
setSize(500, 300);
// при натискане на Х на проореца, да се затвори приложението
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container window = getContentPane();
window.setLayout(new GridLayout(0, 2, 10, 10));
// Добавяме инв. номер в контейнера
label1 = new JLabel("Инвертарен номер");
tf1 = new JTextField();
window.add(label1);
window.add(tf1);
// Добавяме заглавие в контейнера
label2 = new JLabel("Заглавие");
tf2 = new JTextField();
window.add(label2);
window.add(tf2);
// Добавяме режисьор в контейнера
label3 = new JLabel("Режисьор");
tf3 = new JTextField();
window.add(label3);
window.add(tf3);
// Добавяме жанр в контейнера
label4 = new JLabel("Жанр");
String[] items = { "Комедия", "Екшън", "Драма" };
combo1 = new JComboBox(items);
window.add(label4);
window.add(combo1);
// Добавяме година на излизане в контейнера
label5 = new JLabel("Година на излизане");
tf5 = new JTextField();
window.add(label5);
window.add(tf5);
// Добавяме бутоните в контейнера
btn1 = new JButton("Справка");
btn2 = new JButton("Добави");
window.add(btn1);
window.add(btn2);
// При кликването върху бутоните, добавя евент, който се хендълва по-долу
btn1.addActionListener(this);
btn2.addActionListener(this);
setVisible(true);
}
// Извиква се при натискане на бутон, регистриран с addActionListener(this)
public void actionPerformed(ActionEvent e) {
// Извиква се, когато се кликне на бутон `Справки`.
if (e.getSource() == btn1)
{
// Показване на диалогов прозорец
new Dialog(movies);
}
// Извиква се, когато се кликне на бутон `Добавяне`.
else if (e.getSource() == btn2)
{
// Запазване на въведените данни в динамичния масив `movies`.
String id = tf1.getText();
String title = tf2.getText();
String director = tf3.getText();
String genre = tf5.getText();
String year = combo1.getSelectedItem().toString();
System.out.println("Инвертарен номер: " + id);
System.out.println("Заглавие: " + title);
System.out.println("Режисьор: " + director);
System.out.println("Жанр: " + genre);
System.out.println("Година на излизане: " + year);
Movie movie = new Movie();
movie.setId(id);
movie.setTitle(title);
movie.setDirector(director);
movie.setGenre(genre);
movie.setYear(year);
movies.add(movie);
System.out.println("Успешно добавен!");
}
}
}
public class Movie {
private String id;
private String title;
private String director;
private String genre;
private String year;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDirector() {
return director;
}
public void setDirector(String director) {
this.director = director;
}
public String getGenre() {
return genre;
}
public void setGenre(String genre) {
this.genre = genre;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
}
public class Dialog extends JDialog {
private JTable table1;
public Dialog(List<Movie> movies) {
setTitle("Справка");
setSize(500, 300);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
Container window = getContentPane();
window.setLayout(null);
String[] col = new String[] { "Инв. номер", "Заглавие", "Режисьор", "Жанр", "Година на излизане" };
DefaultTableModel tableModel = new DefaultTableModel(col, 0);
for (int i = 0; i < movies.size(); i++) {
String id = movies.get(i).getId();
String title = movies.get(i).getTitle();
String director = movies.get(i).getDirector();
String genre = movies.get(i).getGenre();
String year = movies.get(i).getYear();
Object[] data = { id, title, director, genre, year };
tableModel.addRow(data);
}
//TableModel tableModel = new DefaultTableModel(movies.toArray(new Object[][] {}), columns.toArray());
table1 = new JTable(tableModel);
window.add(table1);
setVisible(true);
}
}
【问题讨论】:
-
您是否有理由通过
window.setLayout(null);从对话框内容窗格中删除布局管理器? -
@maloomeister,没有理由。我已经测试了很多,它基本上删除了白色背景,但无论哪种方式都没有出现。这就是我写这个问题的原因。