java - 如何在 JFrame 打开时附加进度条?

标签 java swing

我想将进度条附加到框架,而不是我目前拥有的测试开始按钮。进度条有效,但我希望它在窗口暂时打开时运行,然后我可以将它附加到以后我想要的任何内容。

代码:

import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.JProgressBar;
import javax.swing.JButton;

public class ProgressBarWindow extends JFrame {
    private static final long serialVersionUID = 1L;
    private JPanel contentPane;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ProgressBarWindow frame = new ProgressBarWindow();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public ProgressBarWindow() {
        try {
             UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        } catch(Exception e) { }

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 183);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JProgressBar progressBar = new JProgressBar();
        progressBar.setBounds(22, 77, 386, 27);
        contentPane.add(progressBar);

        JButton btnNewButton = new JButton("Cancel");
        btnNewButton.setBounds(319, 111, 89, 23);
        btnNewButton.addMouseListener(new myMouseListener2());
        contentPane.add(btnNewButton);

        JButton btnStart = new JButton("Start");
        btnStart.addActionListener(new btnDoAction(progressBar));
        btnStart.setBounds(220, 111, 89, 23);
        contentPane.add(btnStart);
    }
}

class myClose implements MouseListener {
    myClose() { }

    @Override
    public void mouseClicked(MouseEvent e) {
         final Component source = e.getComponent();
         final JFrame frame = (JFrame) SwingUtilities.getRoot(source);
         frame.dispose();
    }

    @Override
    public void mousePressed(MouseEvent e) {
         final Component source = e.getComponent();
         final JFrame frame = (JFrame) SwingUtilities.getRoot(source);
         frame.dispose();
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }
}

class btnDoAction implements ActionListener{
    JProgressBar temp = new JProgressBar();

    btnDoAction(JProgressBar p) {
        this.temp = p;
    }

    public void actionPerformed (ActionEvent e){
        new Thread(new thread1(temp)).start(); //Start the thread
    }
}

class thread1 implements Runnable{
    JProgressBar pBar = new JProgressBar();

    thread1(JProgressBar u) {
        this.pBar = u;
    }

    public void run(){
        for (int i=0; i<=100; i++){ //Progressively increment variable i
            pBar.setValue(i); //Set value
            pBar.repaint(); //Refresh graphics
            try{Thread.sleep(50);} //Sleep 50 milliseconds
            catch (InterruptedException err){}
        }
    }
}

enter image description here

最佳答案

如果我理解正确,不要使用 JFrame 作为基础组件,而是从 JPanel 扩展您的类,这样您就可以将它添加到任何您想要的东西。

然后您可以提供 setter 和 getter 方法来调整进度条,但我会通过某种接口(interface)契约来实现。

  • 不要使用null 布局。您无法控制字体、字体指标、渲染管道和其他影响空间组件数量的属性,这些组件需要在多个系统(即使是运行相同操作系统的系统)上正确渲染。
  • 不要在按钮上使用 MouseListener,而是使用 ActionListeners。考虑到用户何时点击按钮并按下空格/齐纳
  • 不要从事件调度线程以外的任何线程更新 UI。参见 Concurrency in Swing更多细节。考虑改用 SwingWorker,它具有将后台线程与 EDT 同步的功能,并内置进度支持

已更新

enter image description here

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class LayoutExample {

    public static void main(String[] args) {
        new LayoutExample();
    }

    public LayoutExample() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new ProgressPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ProgressPane extends JPanel {

        private JProgressBar pb;
        private JButton start;
        private JButton cancel;

        public ProgressPane() {

            pb = new JProgressBar();
            start = new JButton("Start");
            cancel = new JButton("Cacnel");

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();

            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.insets = new Insets(50, 10, 5, 10);
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.weightx = 1;
            gbc.gridwidth = 2;
            add(pb, gbc);

            gbc.gridx = 0;
            gbc.gridy = 1;
            gbc.insets = new Insets(0, 0, 0, 5);
            gbc.fill = GridBagConstraints.NONE;
            gbc.weightx = 1;
            gbc.gridwidth = 1;
            gbc.anchor = GridBagConstraints.EAST;
            add(start, gbc);

            gbc.weightx = 0;
            gbc.gridx = 1;
            gbc.insets = new Insets(0, 0, 0, 10);
            gbc.anchor = GridBagConstraints.WEST;
            add(cancel, gbc);

        }


    }
}

关于java - 如何在 JFrame 打开时附加进度条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23745914/

相关文章:

在 Netbeans 中编写代码时 Java 导入错误

java - java中双向链表实现的效率

Java - MaskFormatter

java - 如何布局两种日期格式之间范围的文本

java - 如何判断哪个项目触发了鼠标监听器

java - 当在selenium中同时打开多个页面窗口时,如何导航到特定选项卡?

java - 将 Java 匿名内部类转换为 Lambda 表达式后,范围会发生什么变化?

java - 查询ARP缓存获取MAC ID

java - 对绘制的对象进行动画处理

java - 使用网格布局和获取组合框