public class ImagePanel extends JPanel{
private String defaultbg = "Icons/background.jpg";
private String path = "";
private BufferedImage img;
private GridBagConstraints gbc = new GridBagConstraints();
public ImageIcon bgicon;
private Image bg;
public static boolean defaultbgset = true;
public ImagePanel(){
if(defaultbgset){
path = defaultbg;
System.out.println("path in default = " + path);
} else {
if(GUISettings.getPath() != null){
path = GUISettings.getPath();
System.out.println("path in userBG = " + path);
}
}
bgicon = new ImageIcon(getClass().getResource(path));
bg = (new ImageIcon(bgicon.getImage().getScaledInstance(1024, 800, java.awt.Image.SCALE_SMOOTH))).getImage();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(bg, 0, 0, getWidth(), getHeight(), this);
}
public ImageIcon getDrawBoardBackground(){
return bgicon;
}
public void setPath(String p){
this.path = p;
}
public void resetPath(){
this.path = defaultbg;
}
}
现在使用Guisettings
类:
public class GUISettings extends JPanel implements ActionListener{
private TitledBorder title = BorderFactory.createTitledBorder("User Interface Settings");
private JLabel lbackground, userbg;
private JTextField bgpath;
private GridBagConstraints gbc = new GridBagConstraints();
public static JRadioButton default_bg, user_bg;
private JButton browse;
public static File file;
private JLabel userfile = new JLabel("Not chosen.");
public static String userBgPath = null;
public GUISettings(){
//this.setLayout(new GridBagLayout());
Dimension size = getPreferredSize();
size.setSize(200,150); //w, h
this.setPreferredSize(size);
this.setBorder(title);
JPanel toppane = new JPanel();
toppane.setLayout(new GridBagLayout());
(..)
browse = new JButton("Choose file");
browse.setActionCommand("browse");
browse.addActionListener(this);
gbc.gridx = 1;
gbc.gridy = 2;
gbc.insets = new Insets(0,0,0,0);
toppane.add(browse,gbc);
gbc.gridx = 2;
gbc.gridy = 2;
gbc.insets = new Insets(0,5,0,0);
toppane.add(userfile,gbc);
add(toppane, BorderLayout.NORTH);
JPanel midpane = new JPanel();
midpane.setLayout(new GridBagLayout());
add(midpane, BorderLayout.CENTER);
(..)
}
@Override
public void actionPerformed(ActionEvent e) {
if("browse".equalsIgnoreCase(e.getActionCommand())){
final JFileChooser fc = new JFileChooser();
fc.setFileFilter(new ExtensionFileFilter());
int returnVal = fc.showOpenDialog(fc);
if (returnVal == JFileChooser.APPROVE_OPTION) {
file = fc.getSelectedFile();
//This is where a real application would open the file.
userfile.setText(file.getName());
userBgPath = file.getPath();
// THIS IS WHERE I UPDATE PATH etc.
MainFrame.bg.setPath(userBgPath);
MainFrame.bg.defaultbgset = false; // set to user
MainFrame.bg.repaint();
MainFrame.bg.revalidate();
user_bg.setSelected(true);
System.out.println("File: " + file.getName() + ".");
} else {
MainFrame.bg.defaultbgset = true;
MainFrame.bg.resetPath();
MainFrame.bg.repaint();
MainFrame.bg.revalidate();
default_bg.setSelected(true);
}
} // end of if
}
public static String getPath(){
return userBgPath;
}
}
然后将file.getPath()字符串传递给ImagePanel类
经过这条小路也没什么用。当路径改变时,您实际上需要读取图像。因此,在您的set path方法中,我想您需要添加如下代码:
bgicon = new ImageIcon(getClass().getResource(path));
bg = (new ImageIcon(bgicon.getImage().getScaledInstance(1024, 800, java.awt.Image.SCALE_SMOOTH))).getImage();
repaint();
班级应该负责重新粉刷自己。
因此,我尝试使用getContentPane().setBackground(color.white)并尝试将table和scrollpane设置为白色。 这是唯一一个我不能改变颜色的框架,它是在另一个类中创建的- 通过这样做,我得到了另一个面板来成功地改变颜色
我无法让JPanel改变颜色。我也不能让JFrame改变颜色。我在网上查过...我还有一个程序,它有几乎相同的代码来设置JPanel和JFrame。我就是不能让它起作用。 下面是我的主要方法: 编辑:稍后在我的主要方法中有 下面是JPanel的构造函数: 背景颜色保持默认灰色。
问题内容: 在Java中,是否可以制作一个跳过背景,使其背景透明(除了上面的组件之外)是透明的? 问题答案: 它会将绘画背景传递给其父级,后者可能会绘制自己的背景。 您可以进行屏幕捕获,然后使用它来绘制面板的背景。
我试图在JFrame中更改JPanel的背景。JFrame由JPanels组成,很像一个网格。我试图改变JFrame中的一个随机JPanel,并查看循环中每一次的颜色变化。 如果取消对panel.add(individualPanel)行的注释,这将显示颜色变化,但它会不断向JFrame添加越来越多的JPanels。但是,注释这一行可以让我更改颜色,但不会显示JFrame中的任何更改。我试着修改了
问题内容: 我如何告诉paint方法仅在JPanel上而不是在整个JFrame上绘制背景。我的JFrame大小大于JPanel。当我尝试为JPanel绘制网格背景时,网格似乎遍及整个JFrame,而不仅仅是JPanel。 以下是部分代码: 问题答案: camickr是正确的。所以: 您需要严格将工程图与不同组件分开。Swing已经在管理子组件,因此绝对不需要在Panel的Frame中实现图形(调用
问题内容: 这是我的代码,它确实找到了图像,所以这不是我关心的问题,我关心的是如何使该图像成为面板的背景。我正在尝试使用Graphics,但是我不起作用,有什么想法吗?请?? 问题答案: 您的代码中有一个错误。在取消引用之前,将其设置为该行。这肯定会抛出一个。与其声明自己的Graphics对象,不如使用传递给要用于绘画的方法的那个。要在Swing中执行此操作,您应该实现绘制图像的方法,如下所示: