使用JFileChooser后未显示Java JSlider

时间:2019-07-01 03:41:31

标签: java swing jpanel jfilechooser jslider

当我使用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有点陌生,因此任何建议都将不胜感激。 谢谢。

3 个答案:

答案 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的基础知识。也许从以下部分开始:

  1. 如何编写ActionListener
  2. 如何使用滑块
  3. 如何使用CardLayout(而不是添加/删除组件)。

答案 2 :(得分:0)

我有一个类似的问题,我找到了updateUI()方法的解决方案。看下面:

'file.test'

因此,当您关闭JFilechooser时,您必须这样调用refresh():

private void refresh()
{
   if(slider != null)
        {
           slider.updateUI();
        }
}

我希望这应该起作用。