Java 将图像和文本调整为一行

Java 将图像和文本调整为一行,java,image,swing,jlabel,swingworker,Java,Image,Swing,Jlabel,Swingworker,我有以下代码: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.beans.*; import java.util.Random; @SuppressWarnings("serial") public class ProgressBarDemo extends JPanel implements Ac

我有以下代码:

  import java.awt.*;
   import java.awt.event.*;
  import javax.swing.*;

          import java.beans.*;
 import java.util.Random;
@SuppressWarnings("serial")
 public class ProgressBarDemo extends JPanel
                         implements ActionListener, 
                                    PropertyChangeListener {
private JProgressBar progressBar;
private JButton generateButton;
private JButton exceptionButton;
private JTextArea taskOutput;
private Task task;

class Task extends SwingWorker<Void, Void> {
    /*
     * Main task. Executed in background thread.
     */
    @Override
    public Void doInBackground() {
        Random random = new Random();
        int progress = 0;
        //Initialize progress property.
        setProgress(0);
        while (progress < 100) {
            //Sleep for up to one second.
            try {
                Thread.sleep(random.nextInt(1000));
            } catch (InterruptedException ignore) {}
            //Make random progress.
            progress += random.nextInt(10);
            setProgress(Math.min(progress, 100));
        }
        return null;
    }
    /*
     * Executed in event dispatching thread
     */
    @Override
    public void done() {
        Toolkit.getDefaultToolkit().beep();
        generateButton.setEnabled(true);
        setCursor(null); //turn off the wait cursor
        taskOutput.append("Done!\n");
        JFrame newFrame = new JFrame();
        newFrame.setVisible(true);
        JLabel label = new JLabel("Task Complete");
        newFrame.add(label);
        newFrame.setSize(250, 250);
    }
}
public ProgressBarDemo() {
    super(new BorderLayout());

    JPanel labelpanel = new JPanel();

    JLabel headerLabel = new JLabel("", JLabel.LEADING); 
    headerLabel.setText("TEST APPLICATION");  
    headerLabel.setFont(new Font("Calibri",Font.BOLD,25));
    headerLabel.setForeground(Color.blue);

    ImageIcon icon = new ImageIcon("logo.jpg","hiii");
    JLabel imgl=new JLabel(icon);
    labelpanel.add(imgl);
    labelpanel.add(headerLabel);

    imgl.setBounds(10,10, 150, 70);
    //Create the demo's UI.
    generateButton = new JButton("button1");
    generateButton.setActionCommand("button1");
    generateButton.addActionListener(this);
    generateButton.setBounds(50, 200, 150, 30);

    exceptionButton = new JButton("button2");
    exceptionButton.setActionCommand("button2");
    exceptionButton.addActionListener(this);
    exceptionButton.setBounds(50, 300, 150, 30);

    progressBar = new JProgressBar(0, 100);
    progressBar.setValue(0);
    progressBar.setStringPainted(true);
    //progressBar.setBounds(x, y, width, height)

    taskOutput = new JTextArea(5, 20);
    taskOutput.setMargin(new Insets(5,5,5,5));
    taskOutput.setEditable(false);

    JPanel panel = new JPanel();
    labelpanel.add(headerLabel);
    labelpanel.setVisible(true);
    add(labelpanel, BorderLayout.PAGE_START);
   // panel.add(headerLabel);
    panel.add(generateButton);
   // panel.add(progressBar);
    panel.add(exceptionButton);
    labelpanel.setLayout(new BoxLayout(labelpanel,BoxLayout.Y_AXIS));
    add(panel, BorderLayout.LINE_START);
    add(new JScrollPane(taskOutput), BorderLayout.CENTER);
    panel.add(progressBar);
    setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
}
/**
 * Invoked when the user presses the start button.
 */
public void actionPerformed(ActionEvent evt) {

    generateButton.setEnabled(false);
    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    //Instances of javax.swing.SwingWorker are not reusuable, so
    //we create new instances as needed.
    task = new Task();
    task.addPropertyChangeListener(this);

    task.execute();

}
/**
 * Invoked when task's progress property changes.
 */
public void propertyChange(PropertyChangeEvent evt) {
    if ("progress" == evt.getPropertyName()) {
        int progress = (Integer) evt.getNewValue();
        progressBar.setValue(progress);
        taskOutput.append(String.format(
                "Completed %d%% of task.\n", task.getProgress()));
    } 
}
/**
 * Create the GUI and show it. As with all GUI code, this must run
 * on the event-dispatching thread.
 */
private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("ProgressBarDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //Create and set up the content pane.
    JComponent newContentPane = new ProgressBarDemo();
    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() {
            createAndShowGUI();
        }
    });
}
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入java.beans。*;
导入java.util.Random;
@抑制警告(“串行”)
公共类ProgressBarDemo扩展了JPanel
实现ActionListener,
PropertyChangeListener{
私人JProgressBar progressBar;
私有JButton generateButton;
私有JButton例外按钮;
专用JTextArea任务输出;
私人任务;
类任务扩展SwingWorker{
/*
*主任务。在后台线程中执行。
*/
@凌驾
公共无效doInBackground(){
随机=新随机();
int progress=0;
//初始化进度属性。
setProgress(0);
而(进度<100){
//最多睡一秒钟。
试一试{
Thread.sleep(random.nextInt(1000));
}捕获(中断异常忽略){}
//随机取得进展。
进度+=随机。下一步(10);
setProgress(Math.min(progress,100));
}
返回null;
}
/*
*在事件调度线程中执行
*/
@凌驾
公众假期结束(){
getDefaultToolkit().beep();
generateButton.setEnabled(真);
setCursor(null);//关闭等待光标
taskOutput.append(“完成!\n”);
JFrame newFrame=新JFrame();
newFrame.setVisible(true);
JLabel标签=新JLabel(“任务完成”);
newFrame.add(标签);
newFrame.setSize(250250);
}
}
公共进步组织(){
超级(新边框布局());
JPanel labelpanel=新的JPanel();
JLabel headerLabel=新JLabel(“,JLabel.LEADING”);
headerLabel.setText(“测试应用”);
headerLabel.setFont(新字体(“Calibri”,字体粗体,25));
头部标签。设置前景(颜色。蓝色);
ImageIcon图标=新的ImageIcon(“logo.jpg”、“hiii”);
JLabel imgl=新的JLabel(图标);
labelpanel.add(imgl);
标签面板。添加(标题标签);
imgl.立根(10,10,150,70);
//创建演示的UI。
generateButton=新按钮(“按钮1”);
generateButton.setActionCommand(“button1”);
generateButton.addActionListener(此);
generateButton.setBounds(50、200、150、30);
例外按钮=新按钮(“按钮2”);
exceptionButton.setActionCommand(“按钮2”);
exceptionButton.addActionListener(此);
例外按钮。立根(50、300、150、30);
progressBar=新的JProgressBar(01100);
progressBar.setValue(0);
progressBar.SetStringPaint(真);
//progressBar.setBounds(x、y、宽度、高度)
taskOutput=新的JTextArea(5,20);
taskOutput.setMargin(新插图(5,5,5,5));
taskOutput.setEditable(false);
JPanel面板=新的JPanel();
标签面板。添加(标题标签);
labelpanel.setVisible(真);
添加(labelpanel,BorderLayout.PAGE_START);
//面板。添加(标题标签);
面板。添加(生成按钮);
//面板。添加(进度条);
面板.添加(例外按钮);
labelpanel.setLayout(新的BoxLayout(labelpanel,BoxLayout.Y_轴));
添加(面板、边框布局、线条开始);
添加(新的JScrollPane(taskOutput),BorderLayout.CENTER);
面板。添加(进度条);
setBorder(BorderFactory.createEmptyByOrder(20,20,20,20));
}
/**
*当用户按下开始按钮时调用。
*/
已执行的公共无效操作(操作事件evt){
generateButton.setEnabled(假);
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_Cursor));
//javax.swing.SwingWorker的实例不可重用,因此
//我们根据需要创建新实例。
任务=新任务();
task.addPropertyChangeListener(此);
task.execute();
}
/**
*当任务的进度属性更改时调用。
*/
公共作废属性更改(属性更改事件evt){
if(“progress”==evt.getPropertyName()){
int progress=(整数)evt.getNewValue();
progressBar.setValue(进度);
taskOutput.append(String.format(
“已完成%d%%个任务。\n”,task.getProgress());
} 
}
/**
*创建GUI并显示它。与所有GUI代码一样,它必须运行
*在事件调度线程上。
*/
私有静态void createAndShowGUI(){
//创建并设置窗口。
JFrame=新JFrame(“ProgressBarDemo”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//创建并设置内容窗格。
JComponent newContentPane=newProgressBarDemo();
newContentPane.setOkable(true);//内容窗格必须是不透明的
frame.setContentPane(newContentPane);
//显示窗口。
frame.pack();
frame.setVisible(true);
}
公共静态void main(字符串[]args){
//为事件调度线程计划作业:
//创建并显示此应用程序的GUI。
javax.swing.SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGUI();
}
});
}
}

我有一个图像logo.jpg和文本“testapplication”。我想把这两个都排成一行。在我上面的代码中,图像位于顶部,文本位于下一行。我应该如何修改此代码以使两者都在一行上,而不影响框架中的其他元素?

jLabel可以同时包含图标和文本,因此您只需将它们添加到同一标签即可:

JLabel headerLabel = new JLabel("TEST APPLICATION", JLabel.LEADING); 
ImageIcon icon = new ImageIcon("logo.jpg","hiii");
headerLabel.setIcon(icon);
这样您就不再需要
imgl

作为旁注,不要使用绝对布局。你会遇到这样的问题。改用布局管理器