gpt4 book ai didi

java - 进度条对齐

转载 作者:行者123 更新时间:2023-11-29 10:11:09 26 4
gpt4 key购买 nike

我是多线程和 swing 的初学者。我正在尝试创建一个表单,例如图像中带有多个进度条的表单。到目前为止,我已经想出了下面的代码。我的水平对齐方式很少,但是如何我是不是像下面的图片那样把它们垂直堆叠在一起

Progress bar with progress off different threads  导入 java.awt.; 导入 java.awt.event.; 导入 javax.swing.*;

public class ThreadtestApplication extends JPanel
implements ActionListener {
public final static int ONE_SECOND = 1000;

private JProgressBar progressBar;
private JProgressBar progressBar2;
private JProgressBar progressBar3;
private JProgressBar progressBar4;
private Timer timer;
private JButton startButton;
private JButton ThreadTotal;
private JButton GrandTotal;
private SampleTask task;
// private JTextArea taskOutput;
private String newline = "\n";

public ThreadtestApplication() {
super(new BorderLayout());
task = new SampleTask();

//Create the demo's UI.
startButton = new JButton("Start");
startButton.setActionCommand("start");
startButton.addActionListener(this);
//
// pauseButton = new JButton("Pause");
// pauseButton.setActionCommand("pause");
// pauseButton.addActionListener(this);
//
// resumeButton = new JButton("Resume");
// resumeButton.setActionCommand("resume");
// resumeButton.addActionListener(this);
//

progressBar = new JProgressBar(0, task.getLengthOfTask());
progressBar.setValue(0);
progressBar.setStringPainted(true);

progressBar2 = new JProgressBar(0, task.getLengthOfTask());
progressBar2.setValue(0);
progressBar2.setStringPainted(true);

progressBar3 = new JProgressBar(0, task.getLengthOfTask());
progressBar3.setValue(0);
progressBar3.setStringPainted(true);


progressBar4 = new JProgressBar(0, task.getLengthOfTask());
progressBar4.setValue(0);
progressBar4.setStringPainted(true);


// taskOutput = new JTextArea(5, 20);
// taskOutput.setMargin(new Insets(5,5,5,5));
// taskOutput.setEditable(false);
// taskOutput.setCursor(null); //inherit the panel's cursor
//see bug 4851758

JPanel panel = new JPanel();
panel.add(startButton);
// panel.add(pauseButton);
// panel.add(resumeButton);s
panel.add(progressBar);
panel.add(progressBar2);
panel.add(progressBar3);
panel.add(progressBar3);


add(panel, BorderLayout.EAST);
// add(progressBar, BorderLayout.NORTH);
// add(progressBar2, BorderLayout.NORTH);

// add(progressBar4, BorderLayout.NORTH);
// add(new JScrollPane(taskOutput), BorderLayout.CENTER);
setBorder(BorderFactory.createEmptyBorder(20, 800, 200, 20));
startButton.setBounds(200, 1000, 100, 20);

//Create a timer.
timer = new Timer(ONE_SECOND, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
progressBar.setValue(task.getCurrent());
String s = task.getMessage();
if (s != null) {
// taskOutput.append(s + newline);
// taskOutput.setCaretPosition(
// taskOutput.getDocument().getLength());
}
if (task.isDone()) {
Toolkit.getDefaultToolkit().beep();
timer.stop();
startButton.setEnabled(true);
setCursor(null); //turn off the wait cursor
progressBar.setValue(progressBar.getMinimum());
}
}
});
}

/**
* Called when the user presses the start button.
*/
public void actionPerformed(ActionEvent evt) {
startButton.setEnabled(false);
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
task.go();
timer.start();
}

/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void make() {
// //Make sure we have nice window decorations.
// JFrame.setDefaultLookAndFeelDecorated(true);

//Create and set up the window.
JFrame frame = new JFrame("Thread Test Application");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Create and set up the content pane.
JComponent newContentPane = new ThreadtestApplication();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);

//Display the window.
frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
make();
}
});
}
}
class SampleTask {
private int lengthOfTask;
private int current = 0;
private boolean done = false;
private boolean canceled = false;
private String statMessage;

public SampleTask() {
//Compute length of task...
lengthOfTask = 1000;
}

/**
* Called from Thread test Application to start the task.
*/
public void go() {
final SwingWorker worker = new SwingWorker() {
public Object construct() {
current = 0;
done = false;
canceled = false;
statMessage = null;
return new ActualTask();
}
};
worker.start();
}

/**
* Called from Thread test Application to find out how much work needs
* to be done.
*/
public int getLengthOfTask() {
return lengthOfTask;
}

/**
* Called from ProgressBarDemo to find out how much has been done.
*/
public int getCurrent() {
return current;
}

public void stop() {
canceled = true;
statMessage = null;
}

/**
* Called from Thread test Application to find out if the task has completed.
*/
public boolean isDone() {
return done;
}

/**
* Returns the most recent status message, or null
* if there is no current status message.
*/
public String getMessage() {
return statMessage;
}


class ActualTask {
ActualTask() {

//making a random amount of progress every second.
while (!canceled && !done) {
try {
Thread.sleep(50); //sleep for a second
current += Math.random() * 100; //make some progress
if (current >= lengthOfTask) {
done = true;
current = lengthOfTask;
}
statMessage = "Completed " + current +
" out of " + lengthOfTask + ".";
} catch (InterruptedException e) {
System.out.println("ActualTask interrupted");
}
}
}
}
}

abstract class SwingWorker {
private Object value; // see getValue(), setValue()

/**
* Class to maintain reference to current worker thread
* under separate synchronization control.
*/
private static class ThreadVar {
private Thread thread;
ThreadVar(Thread t) { thread = t; }
synchronized Thread get() { return thread; }
synchronized void clear() { thread = null; }
}

private ThreadVar threadVar;

/**
* Get the value produced by the worker thread, or null if it
* hasn't been constructed yet.
*/
protected synchronized Object getValue() {
return value;
}

/**
* Set the value produced by worker thread
*/
private synchronized void setValue(Object x) {
value = x;
}

/**
* Compute the value to be returned by the <code>get</code> method.
*/
public abstract Object construct();

/**
* Called on the event dispatching thread (not on the worker thread)
* after the <code>construct</code> method has returned.
*/
public void finished() {
}

/**
* A new method that interrupts the worker thread. Call this method
* to force the worker to stop what it's doing.
*/
public void interrupt() {
Thread t = threadVar.get();
if (t != null) {
t.interrupt();
}
threadVar.clear();
}


public Object get() {
while (true) {
Thread t = threadVar.get();
if (t == null) {
return getValue();
}
try {
t.join();
}
catch (InterruptedException e) {
Thread.currentThread().interrupt(); // propagate
return null;
}
}
}



// Start a thread that will call the <code>construct</code> method
// and then exit.

public SwingWorker() {
final Runnable doFinished = new Runnable() {
public void run() { finished(); }
};

Runnable doConstruct = new Runnable() {
public void run() {
try {
setValue(construct());
}
finally {
threadVar.clear();
}

SwingUtilities.invokeLater(doFinished);
}
};

Thread t = new Thread(doConstruct);
threadVar = new ThreadVar(t);
}

/**
* Start the worker thread.
*/
public void start() {
Thread t = threadVar.get();
if (t != null) {
t.start();
}
}

// public void pause() {
// Thread t = threadVar.get();
// if (t != null) {
// t.start();
// }
// }
//
// public void resume() {
// Thread t = threadVar.get();
// if (t != null) {
// t.start();
// }
// }
}

最佳答案

JPanel panel = new JPanel();

JPanel 的默认布局管理器是 FlowLayout,它水平显示组件。

如果您想要垂直布局,则需要使用不同的布局管理器或布局管理器的组合。

也许您使用 GridLayout 创建一个面板。然后将进度条添加到该面板。然后使用不同的布局管理器将面板添加到另一个面板以获得所需的布局。

也许是这样的:

JPanel progressPanel = new JPanel( new GridLayout(0, 1) );
progressPanel.add( progressBar1 );
progressPanel.add( progressBar2 );
progresspanel.add( progressBar2 );
someOtherPanel.add( progressPanel );

阅读 Layout Managers 上的 Swing 教程部分获取更多信息和工作示例。

编辑:

setBorder(BorderFactory.createEmptyBorder(20, 800, 200, 20));

为什么要使用值为 800 和 200 的边框。

尝试一些更合理的:

setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

关于java - 进度条对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33659636/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com