我正在使用Java网站上的一些示例代码,文件选择器似乎得到了我想要的文件,但是当我尝试更新我用来调用文件选择器的gui中的jframe和其他组件时,没有变化。我已经尝试了一些建议的修复程序来更新内容,但似乎没有任何工作。顺便提一下,我的大多数组件都是静态的......
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.awt.event.*;
public class GuiTester extends JFrame {
private static String fileName = "Input File: Please select a file";
//Create a file chooser
private static final JFileChooser fc = new JFileChooser();
private static JButton inputSelectorButton;
private static JButton outputSelectorButton;
private static JFrame frame = new JFrame( "Gui Tester" );
private static JPanel panel = new JPanel();
private static JLabel inputFile = new JLabel( fileName );
public static void main(String[] args) {
go();
}
private static void go() {
inputSelectorButton = new JButton ( "Select Input File" );
outputSelectorButton = new JButton ( "Select Output File" );
Font bigFont = new Font( "sans", Font.BOLD, 22 );
Font smallFont = new Font( "sans", Font.PLAIN, 9 );
panel.setLayout(new BoxLayout( panel, BoxLayout.Y_AXIS ) );
JLabel description0 = new JLabel(" ");
JLabel description6 = new JLabel(" ");
JLabel inputFile = new JLabel( fileName );
inputFile.setFont( smallFont );
inputSelectorButton.addActionListener( new inputSelectorListener() );
JButton startButton = new JButton ( "GO!" );
panel.add(description0);
panel.add(description6);
panel.add( inputFile );
panel.add( inputSelectorButton );
panel.add( outputSelectorButton );
panel.add( startButton );
frame.getContentPane().add( BorderLayout.CENTER, panel );
inputFile.setAlignmentX(JComponent.CENTER_ALIGNMENT);
inputSelectorButton.setAlignmentX(JComponent.CENTER_ALIGNMENT);
outputSelectorButton.setAlignmentX(JComponent.CENTER_ALIGNMENT);
startButton.setAlignmentX(JComponent.CENTER_ALIGNMENT);
frame.setSize(370,400);
panel.setSize(370,400);
frame.setVisible(true);
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
public static class inputSelectorListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == inputSelectorButton) {
int returnVal = fc.showOpenDialog( panel );
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
if ( file.exists() )
fileName = file.getPath();
else
fileName = "File not found, please select a file";
System.out.println(fileName);
inputFile.setText( fileName );
inputFile.validate();
inputFile.repaint();
panel.validate();
panel.repaint();
frame.validate();
frame.repaint();
} else {
System.out.println("Open command cancelled by user.");
}
}
}
}
}
答案 0 :(得分:1)
我没有看到你添加的任何地方
inputFile
panel
任何可展示的东西。
您也在隐藏inputFile
。
您创建了static
引用...
private static JLabel inputFile = new JLabel(fileName);
然后在go
中,您创建一个本地参考...
JLabel inputFile = new JLabel(fileName);
这意味着您在actionPerformed
方法中使用的引用与屏幕上的引用不同。
不要依赖static
解决参考问题,这会让你更快地咬住你,然后你才能意识到......
您可能想看看:
答案 1 :(得分:0)
您应该尝试使用类并更好地组织代码。下面我重新设计了您现有的代码。我没有添加任何东西,但我确实移动了一些东西并为此示例删除了一些不必要的变量。
我将ActionListener更改为AbstractAction,只是为了让您知道。 :-P
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.io.File;
import javax.swing.AbstractAction;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
@SuppressWarnings("serial")
public class GuiTester extends JPanel {
// Create a file chooser
private static final JFileChooser fc = new JFileChooser();
private JLabel inputFile;
public GuiTester(int width, int height) {
Font smallFont = new Font("sans", Font.PLAIN, 9);
JLabel description0 = new JLabel(" ");
JLabel description6 = new JLabel(" ");
JButton startButton = new JButton("Enter");
JButton inputSelectorButton = new JButton(new FileChooserAction(
"Select Input File"));
JButton outputSelectorButton = new JButton("Select Output File");
inputFile = new JLabel("Input File: Please select a file");
inputFile.setFont(smallFont);
inputFile.setAlignmentX(JComponent.CENTER_ALIGNMENT);
inputSelectorButton.setAlignmentX(JComponent.CENTER_ALIGNMENT);
outputSelectorButton.setAlignmentX(JComponent.CENTER_ALIGNMENT);
startButton.setAlignmentX(JComponent.CENTER_ALIGNMENT);
add(description0);
add(description6);
add(inputFile);
add(inputSelectorButton);
add(outputSelectorButton);
add(startButton);
setSize(width, height);
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
}
public JLabel getInputFileLabel() {
return inputFile;
}
@Override
public void invalidate() {
super.invalidate();
// Invalidate the label, you really don't need this, but you should
// reference children in here if you want to explicitly invalidate them
// when the parent gets invalidated. The parent is responsible for
// telling its children what to do and when to do it.
inputFile.invalidate();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// This gets called when you repaint, since you are adding children
// to this panel, painting is pointless. You can however fill the
// background if you wish.
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame("Gui Test");
f.setContentPane(new GuiTester(370, 400));
f.setSize(370, 400);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
}
});
}
public class FileChooserAction extends AbstractAction {
public FileChooserAction(String name) {
super(name);
}
public void actionPerformed(ActionEvent e) {
Container c = ((JButton) e.getSource()).getParent();
GuiTester g = null;
if (c instanceof GuiTester) {
g = (GuiTester) c;
}
int returnVal = fc.showOpenDialog(c);
if (g != null && returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
String fileName = "Input File: Please select a file";
if (file.exists())
fileName = file.getPath();
else
fileName = "File not found, please select a file";
System.out.println(fileName);
g.getInputFileLabel().setText(fileName);
g.validate();
g.repaint();
} else {
System.out.println("Open command cancelled by user.");
}
}
}
}