Java JPanel 对象已更新但更新在屏幕上不可见
Java JPanel object updated but update not visible on the screen
我是 GUI 编程的新手,我不知道如何更新对象并在屏幕上显示更改。我有一个扩展 JPanel 的 class Sudoku。我有一个 JFrame,数独是其中的一部分。我有一个按钮,它调用函数 openFile。这是它的名字:
private void openFileActionPerformed(java.awt.event.ActionEvent evt) {
sudoku = FileManagement.openFile(this, sudoku);
}
数独 对象有一个 9x9 网格,当我调试它时没问题,新值在网格中。但我不知道如何在屏幕上显示新值。我阅读了一些评论并尝试了 sudoku.validate()、sudoku.repaint() 或再次打包 JFrame,但没有成功。因此,如果有人告诉我如何修复它,我将不胜感激。如果我的解释不充分或不清楚,请告诉我在描述中还需要添加什么。谢谢!
编辑 - 添加代码:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
public class Sample extends javax.swing.JFrame {
public Sample() {
initComponents();
}
private void initComponents() {
sudoku = new sudoku.Sudoku();
openFile = new javax.swing.JButton();
openFile.setText("Open");
openFile.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
openFileActionPerformed(evt);
}
});
/*sorry for that part - automaticlly generated, don't know how to make it less*/
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(sudoku)
.addGroup(layout.createSequentialGroup()
.addComponent(openFile)))));
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(sudoku)
.addComponent(openFile)));
pack();
}
private void openFileActionPerformed(java.awt.event.ActionEvent evt) {
sudoku = openFile(this, sudoku);
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Sample().setVisible(true);
}
});
}
private javax.swing.JButton openFile;
private sudoku.Sudoku sudoku;
public static Sudoku openFile(JFrame frame, Sudoku sudoku) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
int result = fileChooser.showOpenDialog(frame);
if (result == JFileChooser.CANCEL_OPTION) {
return sudoku;
}
File fileName = fileChooser.getSelectedFile();
try (ObjectInputStream input = new ObjectInputStream(new FileInputStream(fileName))) {
sudoku = (Sudoku) input.readObject();
} catch (IOException | ClassNotFoundException ioException) {
System.out.println(ioException);
}
return sudoku;
}
}
快速解决该问题的方法是从 JFrame
中删除 JPanel
,更改其值,然后 re-add 将 JPanel
更改为 JFrame
。这可以在下面的示例中看到。
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class PanelFix extends JFrame {
JFrame frame = this;
private JPanel view = a();
PanelFix() {
super("Panel Fix");
setSize(400, 400);
setLocationRelativeTo(null);
getContentPane().add(view);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private JPanel a() {
JPanel panel = new JPanel();
JButton but = new JButton("Press Me");
but.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
getContentPane().remove(view);
view = b();
getContentPane().add(view);
repaint();
validate();
}
});
panel.add(but);
return panel;
}
private JPanel b() {
JPanel panel = new JPanel();
panel.add(new JLabel("Second Panel"));
return panel;
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> new PanelFix());
}
}
如果这不能解决问题,喜欢Andrew Thompson said, add an MCVE。这应该能让我们帮助解决您遇到的确切问题
我是 GUI 编程的新手,我不知道如何更新对象并在屏幕上显示更改。我有一个扩展 JPanel 的 class Sudoku。我有一个 JFrame,数独是其中的一部分。我有一个按钮,它调用函数 openFile。这是它的名字:
private void openFileActionPerformed(java.awt.event.ActionEvent evt) {
sudoku = FileManagement.openFile(this, sudoku);
}
数独 对象有一个 9x9 网格,当我调试它时没问题,新值在网格中。但我不知道如何在屏幕上显示新值。我阅读了一些评论并尝试了 sudoku.validate()、sudoku.repaint() 或再次打包 JFrame,但没有成功。因此,如果有人告诉我如何修复它,我将不胜感激。如果我的解释不充分或不清楚,请告诉我在描述中还需要添加什么。谢谢!
编辑 - 添加代码:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
public class Sample extends javax.swing.JFrame {
public Sample() {
initComponents();
}
private void initComponents() {
sudoku = new sudoku.Sudoku();
openFile = new javax.swing.JButton();
openFile.setText("Open");
openFile.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
openFileActionPerformed(evt);
}
});
/*sorry for that part - automaticlly generated, don't know how to make it less*/
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(sudoku)
.addGroup(layout.createSequentialGroup()
.addComponent(openFile)))));
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(sudoku)
.addComponent(openFile)));
pack();
}
private void openFileActionPerformed(java.awt.event.ActionEvent evt) {
sudoku = openFile(this, sudoku);
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Sample().setVisible(true);
}
});
}
private javax.swing.JButton openFile;
private sudoku.Sudoku sudoku;
public static Sudoku openFile(JFrame frame, Sudoku sudoku) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
int result = fileChooser.showOpenDialog(frame);
if (result == JFileChooser.CANCEL_OPTION) {
return sudoku;
}
File fileName = fileChooser.getSelectedFile();
try (ObjectInputStream input = new ObjectInputStream(new FileInputStream(fileName))) {
sudoku = (Sudoku) input.readObject();
} catch (IOException | ClassNotFoundException ioException) {
System.out.println(ioException);
}
return sudoku;
}
}
快速解决该问题的方法是从 JFrame
中删除 JPanel
,更改其值,然后 re-add 将 JPanel
更改为 JFrame
。这可以在下面的示例中看到。
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class PanelFix extends JFrame {
JFrame frame = this;
private JPanel view = a();
PanelFix() {
super("Panel Fix");
setSize(400, 400);
setLocationRelativeTo(null);
getContentPane().add(view);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private JPanel a() {
JPanel panel = new JPanel();
JButton but = new JButton("Press Me");
but.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
getContentPane().remove(view);
view = b();
getContentPane().add(view);
repaint();
validate();
}
});
panel.add(but);
return panel;
}
private JPanel b() {
JPanel panel = new JPanel();
panel.add(new JLabel("Second Panel"));
return panel;
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> new PanelFix());
}
}
如果这不能解决问题,喜欢Andrew Thompson said, add an MCVE。这应该能让我们帮助解决您遇到的确切问题