使用 java Swing 单击下一步按钮时图像不显示在 JLabel 上
image doesnt shows on JLabel when click on next button, using java Swing
我正在尝试制作一个小程序,当用户单击“下一步”时在 JLabel 上显示图片 Button.The 问题是当我单击“下一步”按钮时它会显示 nothing.but 如果我调整框架大小它会显示所有图片从目录。而不是一次一张图片。
请原谅我的英语。
这是我的代码。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.imageio.ImageIO;
import java.io.*;
import java.awt.image.BufferedImage;
class test {
public static void main(String args[]) {
frame f = new frame();
f.gui();
f.actions();
}
}
class frame {
BufferedImage file;
File img;
ImageIcon icon;
JLabel image;
JFrame frame;
JPanel panel;
String[] path = { "juice.jpg", "gal.jpg", "truck.jpg", "Drive.jpg" };
JButton next = new JButton("NEXT");
JButton pre = new JButton("PREVOIUS");
JTextField field = new JTextField(10);
static int num = 0;
public void gui() {
frame = new JFrame("pic gallery");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
FlowLayout flow = new FlowLayout();
frame.setLayout(flow);
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
panel.add(next);
panel.add(pre);
panel.add(field);
JLabel piclabel = new JLabel();
frame.getContentPane().add(panel);
}
void actions() {
next.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
img = new File(path[num]);
System.out.println(num);
try {
file = ImageIO.read(img);
icon = new ImageIcon(file);
image = new JLabel("", icon, JLabel.CENTER);
image.setVisible(true);
frame.getContentPane().add(image);
} catch (IOException g) {
}
if (num < path.length - 1) {
num++;
field.setText(num + "");
} else {
num = 0;
}
}
});
}
}
在frame.getContentPane().add(image);
之后添加frame.revalidate()
和frame.repaint()
Swing 在对布局层次结构执行更新时是懒惰的,这是一件好事,想象一下添加几十个组件并为每个组件更新整个组件层次结构。
因此,您需要在进行更改后手动更新容器
added as you suggested . now it shows next image on frame along with prevous image. but i wants 1 image at a time
然后删除第一张图片,或者更好的是,与其每次都创建一个新的 JLabel
,不如创建一个 JLabel
并简单地更改它的 icon
属性 ,这应该自动使容器失效
在接下来的 ActionListener 中,您需要删除之前的标签,然后添加新标签
try
{
file = ImageIO.read(img);
icon = new ImageIcon(file);
if(image != null) frame.remove(image);
image = new JLabel("", icon, SwingConstants.CENTER);
image.setVisible(true);
frame.getContentPane().add(image);
frame.revalidate();
frame.repaint();
}
catch (IOException g)
{
}
我正在尝试制作一个小程序,当用户单击“下一步”时在 JLabel 上显示图片 Button.The 问题是当我单击“下一步”按钮时它会显示 nothing.but 如果我调整框架大小它会显示所有图片从目录。而不是一次一张图片。 请原谅我的英语。 这是我的代码。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.imageio.ImageIO;
import java.io.*;
import java.awt.image.BufferedImage;
class test {
public static void main(String args[]) {
frame f = new frame();
f.gui();
f.actions();
}
}
class frame {
BufferedImage file;
File img;
ImageIcon icon;
JLabel image;
JFrame frame;
JPanel panel;
String[] path = { "juice.jpg", "gal.jpg", "truck.jpg", "Drive.jpg" };
JButton next = new JButton("NEXT");
JButton pre = new JButton("PREVOIUS");
JTextField field = new JTextField(10);
static int num = 0;
public void gui() {
frame = new JFrame("pic gallery");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
FlowLayout flow = new FlowLayout();
frame.setLayout(flow);
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
panel.add(next);
panel.add(pre);
panel.add(field);
JLabel piclabel = new JLabel();
frame.getContentPane().add(panel);
}
void actions() {
next.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
img = new File(path[num]);
System.out.println(num);
try {
file = ImageIO.read(img);
icon = new ImageIcon(file);
image = new JLabel("", icon, JLabel.CENTER);
image.setVisible(true);
frame.getContentPane().add(image);
} catch (IOException g) {
}
if (num < path.length - 1) {
num++;
field.setText(num + "");
} else {
num = 0;
}
}
});
}
}
在frame.getContentPane().add(image);
frame.revalidate()
和frame.repaint()
Swing 在对布局层次结构执行更新时是懒惰的,这是一件好事,想象一下添加几十个组件并为每个组件更新整个组件层次结构。
因此,您需要在进行更改后手动更新容器
added as you suggested . now it shows next image on frame along with prevous image. but i wants 1 image at a time
然后删除第一张图片,或者更好的是,与其每次都创建一个新的 JLabel
,不如创建一个 JLabel
并简单地更改它的 icon
属性 ,这应该自动使容器失效
在接下来的 ActionListener 中,您需要删除之前的标签,然后添加新标签
try
{
file = ImageIO.read(img);
icon = new ImageIcon(file);
if(image != null) frame.remove(image);
image = new JLabel("", icon, SwingConstants.CENTER);
image.setVisible(true);
frame.getContentPane().add(image);
frame.revalidate();
frame.repaint();
}
catch (IOException g)
{
}