Java 添加组件时删除图像
我目前在JFrame和图像方面有问题。该程序使用一个小程序,然后将其添加到另一个类中的JFrame中,因此它可以作为小程序或应用程序运行。目前,该框架仅容纳少量图像,没有任何组件。我最近尝试使用绝对定位(LayoutManger为null)添加一个JTextField,它工作正常,只是删除了所有图像,只剩下一个JTextField。为什么会这样?我怎样才能修好它?我的代码贴在下面。谢谢 主类(创建小程序和图像): JFrame类(创建JFrame并添加小程序):Java 添加组件时删除图像,java,image,swing,applet,components,Java,Image,Swing,Applet,Components,我目前在JFrame和图像方面有问题。该程序使用一个小程序,然后将其添加到另一个类中的JFrame中,因此它可以作为小程序或应用程序运行。目前,该框架仅容纳少量图像,没有任何组件。我最近尝试使用绝对定位(LayoutManger为null)添加一个JTextField,它工作正常,只是删除了所有图像,只剩下一个JTextField。为什么会这样?我怎样才能修好它?我的代码贴在下面。谢谢 主类(创建小程序和图像): JFrame类(创建JFrame并添加小程序): 看看这个例子,看看这是否有帮助。
看看这个例子,看看这是否有帮助。有关上述主题的一些信息,请参见此。如果还有不清楚的地方,请告诉我
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
public class BackgroundExample {
private JTextField tField;
private JButton button;
private CustomPanel contentPane;
private void displayGUI() {
JFrame frame = new JFrame("Background Example");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
contentPane = new CustomPanel();
contentPane.setLayout(new GridBagLayout());
JPanel componentPanel = new JPanel();
componentPanel.setOpaque(false);
tField = new JTextField("Nothing to display yet...", 20);
button = new JButton("Click me not!");
componentPanel.add(tField);
componentPanel.add(button);
contentPane.add(componentPanel);
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
new BackgroundExample().displayGUI();
}
};
EventQueue.invokeLater(runnable);
}
}
class CustomPanel extends JPanel {
private BufferedImage bImage;
public CustomPanel() {
try {
bImage = ImageIO.read(new URL("http://i.imgur.com/fHiBMwI.jpg"));
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
@Override
public Dimension getPreferredSize() {
return (bImage != null ? new Dimension(
bImage.getWidth(), bImage.getHeight()) : new Dimension(400, 400));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(bImage, 0, 0, this);
}
}
JApplet很可能是不透明的,另一个问题是混合了重量和重量轻的组件,这就出现了z顺序问题。更好的解决方案是将应用程序逻辑与容器分离,这样您就可以在顶级容器之间简单地移动它……您还应该知道,小程序具有非常严格的权限,这意味着,它不太可能访问本地驱动器“。我最近尝试使用绝对定位(LayoutManger为null)添加JTextField,它工作正常,但删除了所有图像“你对‘工作正常’有一个奇怪的定义。我以前使用过绝对定位,没有任何问题。直到最近才发生这种情况。不确定是我的课程设置还是什么。我认为这与定位无关。提示:1)添加@MadProgrammer(或其他任何人-the@很重要)以通知他们新的评论。2) 尝试在两台或多台机器上,在可调整大小的GUI中的两个或多个PLAF中测试“works fine”空布局。3) 不要对皈依者说教。(布局规则)。4) 为了更快地获得更好的帮助,发布一个(MCTRE)。@MadProgrammer,你能编辑我的代码并告诉我你的意思吗?我很难理解,一个直观的例子真的会有帮助。@NicholasCreech:非常欢迎你,并保持微笑:-)只需要记住一点,以前程序访问图像的方式,如果程序转移到其他计算机上,图像将必须放在桌面上指定的位置,虽然在本例中,当您创建一个jar文件时,这种情况不会发生。
package net.xenix.src ;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class XenixApplicationWindow extends JFrame
{
private static final long serialVersionUID = 1L;
static XenixMain xenix = new XenixMain();
static ImageIcon xenixIcon = new ImageIcon(XenixMain.imagePath + "XenixIcon.png");
public static void main(String[] args)
{
new XenixApplicationWindow();
}
public XenixApplicationWindow()
{
JFrame frame = new JFrame();
JTextField userInput = new JTextField(15);
JPanel panel1 = new JPanel(null);
frame.add(xenix);
frame.setSize(1600, 900);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setResizable(true);
frame.setIconImage(xenixIcon.getImage());
userInput.setBounds(0, 0, 120, 10);
panel1.add(userInput);
frame.add(panel1);
frame.setContentPane(panel1);
frame.setLocationRelativeTo(null);
frame.setTitle("Xenix");
xenix.init();
xenix.start();
frame.setVisible(true);
}
}
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
public class BackgroundExample {
private JTextField tField;
private JButton button;
private CustomPanel contentPane;
private void displayGUI() {
JFrame frame = new JFrame("Background Example");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
contentPane = new CustomPanel();
contentPane.setLayout(new GridBagLayout());
JPanel componentPanel = new JPanel();
componentPanel.setOpaque(false);
tField = new JTextField("Nothing to display yet...", 20);
button = new JButton("Click me not!");
componentPanel.add(tField);
componentPanel.add(button);
contentPane.add(componentPanel);
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
new BackgroundExample().displayGUI();
}
};
EventQueue.invokeLater(runnable);
}
}
class CustomPanel extends JPanel {
private BufferedImage bImage;
public CustomPanel() {
try {
bImage = ImageIO.read(new URL("http://i.imgur.com/fHiBMwI.jpg"));
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
@Override
public Dimension getPreferredSize() {
return (bImage != null ? new Dimension(
bImage.getWidth(), bImage.getHeight()) : new Dimension(400, 400));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(bImage, 0, 0, this);
}
}