当我使用JFileChooser然后尝试添加其他组件时,它们没有显示。如果我删除JFileChooser,它们会显示出来。我在eclipse上用Java编写,有两个文件。
为了简化该问题,我删除了大部分代码,但是它仍然存在。
Main.java:
import java.awt.Color;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import javax.swing.JFrame;
public class Main {
public static void main(String args[]) throws InterruptedException, IOException {
int width = 1280;
int height = 720;
Frame f = new Frame(Color.BLACK, width, height);
JFrame frame = new JFrame("Title"); //create a new window and set title on window
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //set the window to close when the cross in the corner is pressed
frame.setSize(width,height);
frame.add(f); //add the content of the game object to the window
frame.setVisible(true);
long interval = (long)10 * 10000000;
long t = 0;
while(true) {
if(System.nanoTime() - t >= interval) { //repaints at a certain fps
t = System.nanoTime();
f.repaint();
}
TimeUnit.NANOSECONDS.sleep(10);
}
}
}
Frame.java:
import java.awt.Color;
import java.awt.Graphics;
import java.io.IOException;
import javax.swing.JSlider;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
public class Frame extends JPanel {
int menuNum = 0;
boolean first = true;
JButton nextButton = new JButton("Next");
JSlider slider = new JSlider(0,255,0);
JFileChooser fileChooser = new JFileChooser();
public Frame(Color background, int w, int h) throws IOException { //initialize
this.setBackground(background);
setFocusable(true);
}
public void paintComponent(Graphics G) {
super.paintComponent(G);
G.setColor(Color.WHITE);
G.drawString("MenuNum: " + menuNum, 1000, 500); //for debugging
if(menuNum == 0) { //first menu
if(first) { //only run once
first = false;
this.removeAll();
this.add(nextButton);
System.out.println("HERE");
}
if(fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { //if "Done" is selected
menuNum = 1; //go to next menu
first = true;
}
}
if(menuNum == 1) { //second menu
if(first) { //only run once
first = false;
this.removeAll();
this.add(nextButton);
this.add(slider); //<This is the slider that is not showing up
System.out.println("HERE2");
}
}
}
}
如果您是在自己的计算机上运行此文件,则可以选择任何文件进行测试,因为它对所选文件不起作用。
我对JPanels和JFrames有点陌生,因此任何建议都将不胜感激。 谢谢。
答案 0 :(得分:1)
只要遵循相同的想法,您就会得到
public MyControlPanel() {
initComponents();
JSlider slider = new JSlider();
slider.setMajorTickSpacing(10);
slider.setPaintLabels(true);
slider.setPaintTicks(true);
JTextField boundary_length = new JTextField("Boundary Length");
JTextField area = new JTextField("Area");
setLayout(new FlowLayout());
this.add(slider);
this.add(area);
this.add(boundary_length);
}
答案 1 :(得分:1)
首先,绝对没有理由进行任何定制绘画。您永远不要尝试以绘画方法从JPanel添加/删除组件。
应将组件添加到类的构造函数中的面板中。因此,这意味着应将按钮添加到面板中。
然后将ActionListener
添加到按钮。单击按钮后,您将进行一些处理。
如果要更改ActionListener
中面板上的组件,则基本逻辑是:
panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint();
因此,您需要revalidate()
来调用布局管理器。否则,添加的组件的大小为(0,0),这意味着没有任何内容可以绘制。
通过阅读Swing Tutorial了解Swing的基础知识。也许从以下部分开始:
答案 2 :(得分:0)
我有一个类似的问题,我找到了updateUI()方法的解决方案。看下面:
'file.test'
因此,当您关闭JFilechooser时,您必须这样调用refresh():
private void refresh()
{
if(slider != null)
{
slider.updateUI();
}
}
我希望这应该起作用。