【问题标题】:Dynamically change Background Image of a JPanel动态更改 JPanel 的背景图像
【发布时间】:2013-06-07 07:42:26
【问题描述】:

尝试更改 jpanel 的 BG 图像,但我无法在任何正常方法上调用 poaint,当我构建构造函数但我不想重建构造函数时,它工作得很好。

....

通过在我的中心框架中放置标签并调用 setIcon 找到了一种解决方案,但我需要能够提取相关信息,因此我需要找到一种方法将值存储到我的 Jtoggle 按钮中(种族或班级,以便我可以获取它的图片并更改图标)

想法?一切都在 iff 语句之外编译,这是我的症结

RaceButtons_lft[i] =  new JToggleButton();
RaceButtons_lft[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
JToggleButton cb = (JToggleButton)ae.getSource();
for (int j=0; j<MyRaceArray.size(); j++)
{
if (MyRaceArray.get(j).getraceID() == combo_contents.getIndex()){//here is my sticking point, i need to find a way to match MyRaceArray's getRaceID to some value saved withthe Toggle button
final ImageIcon BGCSMs = ScaledImageIcon("Fantasy_Landscape_01.jpg", "Profile Pic", (468-(60*2)), 285);
picLabel.setIcon(BGCSMs);
}//if
}//for
}//action performed;
});//button add action listener

【问题讨论】:

  • 您是否尝试在更改图像后致电repaint...?您还应该将 this 作为 ImageObserver 参数传递给 drawImage 方法
  • 修改了 OP 希望我现在已经更好地解释了这个问题
  • 什么是portraitCenterOptions?它是从什么延伸出来的?
  • 这是一个非常简单的 jane Jpanel 我将编辑 OP 的设置方式
  • 修补并找到了各种各样的解决方案,仍然无法找到一种方法来匹配数据以找到正确的图片但也许有人有一个想法

标签: java swing jpanel paintcomponent


【解决方案1】:

打电话

super.paintComponent(..)

可能 - 取决于超类 - 用背景颜色填充组件。

public void paintComponent(Graphics g) {
  // Let UI Delegate paint first, which 
  // includes background filling since 
  // this component is opaque.

  super.paintComponent(g);       
  g.drawString("This is my custom Panel!",10,20);
  redSquare.paintSquare(g);
}

(请参阅A Closer Look at the Paint Mechanism)。在这种情况下,您不需要 repaint(..)。

【讨论】:

  • 如果 OP 更改了图像,他们需要调用 repaint 来更新它...
  • 你是对的 - 没有看到他在操纵图像。但无论如何阅读教程都会有所帮助:-)
  • 您关于将super.paintComponent 放在首位的建议仍然有效,甚至可能被证明是正确的;)
【解决方案2】:

您可能会遇到许多问题,因为我们没有足够的上下文,所以我们看不到这些问题...

  • 您可能遇到了参考问题,而不是尝试repaint 屏幕上的组件,您无意中得到了错误的参考...
  • 您可能会隐藏您的变量...
  • 您可能正在绘制一个不透明的组件...

假设您发布的代码是线性的(即,它以这个确切的顺序出现在您的代码中或足够接近它),我可以看到一个可能的问题...

ImageIcon RCicon = createImageIcon(temp_race.getActiveHeadshot(), temp_race.getRaceNameString(race.getraceID()));
Image RCimg = RCicon.getImage();
RCimg = RCimg.getScaledInstance((468-(60*2)), 285, java.awt.Image.SCALE_SMOOTH);

portraitCenterOptions.setBackground(Color.White){
    protected void paintComponent(Graphics h)
    {
        //...//
        // There is no way that this reference can be valid...
        // The image created above will only have a local reference unto itself
        // suggestion that you're shadowing your variables...
        final ImageIcon bodypicSM = new ImageIcon(RCimg);
        //...//
    }
};

但如果没有一个可行的例子,就不可能知道......

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.text.DateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ChangeBackground {

    public static void main(String[] args) {
        new ChangeBackground();
    }

    public ChangeBackground() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                final PaintPane pane = new PaintPane();
                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(pane);

                JButton change = new JButton("Change");
                change.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        pane.changeBackground();
                        pane.repaint();
                    }
                });

                frame.add(change, BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class PaintPane extends JPanel {

        private BufferedImage bg;
        private int changes = 0;

        public PaintPane() {
            changeBackground();
        }

        public void changeBackground() {

            bg = new BufferedImage(200, 200, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g = bg.createGraphics();
            FontMetrics fm = g.getFontMetrics();
            g.setColor(getForeground());
            String[] text = {
                "I've been changed " + changes + " times", 
                "Last changed at " + DateFormat.getDateTimeInstance().format(new Date())};
            int y = (200 - (fm.getHeight() * 2)) / 2;
            for (String value : text) {
                int x = (200 - fm.stringWidth(value)) / 2;
                g.drawString(value, x, y + fm.getAscent());
                y += fm.getHeight();
            }
            g.dispose();
            changes++;

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); 
            int x = (getWidth() - bg.getWidth()) / 2;
            int y = (getHeight() - bg.getHeight()) / 2;
            g.drawImage(bg, x, y, this);
        }

    }

}

【讨论】:

    【解决方案3】:

    完成对后台的更改后,在组件上调用repaint()

    【讨论】:

      【解决方案4】:

      所以最终尝试了一些东西并且变得懒惰,在中心添加了一个标签并称为“SetIcon,做我需要它做的事情,不过感谢你的想法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-06
        • 2014-03-12
        • 1970-01-01
        • 2020-07-02
        • 2016-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多