【问题标题】:Java wrong view JPanelJava错误视图JPanel
【发布时间】:2016-07-19 17:11:00
【问题描述】:

我有一个正在运行的桌面应用程序。我有一个 JPanel,其中图像作为背景,其中有两个按钮和一个 JScrollPane,如图 Frame with JPanel 所示。我有一个函数 (showLabel()),当 JScrollPane 结束时,添加带有透明图像的 JLabel 并消失几秒钟。问题是当你添加 JLabel. JLabel bad 显示如图Bad shows 所示。你能帮我解决我的问题吗?

 public class MainWindow {

 private JFrame frame;
 private PanelPopis panelPopis = new PanelPopis(this);
 private MyPaint myPaint;

 public MainWindow {

    setWindow():
    BufferedImage image1 = ImageIO.read(getClass().getClassLoader().getResource("poz.png"));

    this.myPaint = new MyPaint(image1);
    this.frame.add(myPaint);

    this.myPaint.add(panelPopis.setPanel());

}


 private void setWindow() {
    this.frame = new JFrame("DD");
    this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.frame.setSize(400, 680);
    this.frame.setResizable(false);
    this.frame.setLocationRelativeTo(null);
 }

 private void showLabel(){

   JLabel label = new JLabel();

   label.setIcon(new ImageIcon(new ImageIcon(getClass().getClassLoader().getResource("postEn.png")).getImage().getScaledInstance(395, 653, Image.SCALE_DEFAULT)));
   label.setBackground(new Color(0, 0, 0, 10));
   label.setOpaque(true);

   this.frame.invalidate();
   this.frame.add(label);
   this.frame.revalidate();

    int delay2 = 3000; // milliseconds
    ActionListener taskPerformer2 = new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            frame.remove(label);
            frame.revalidate();
            frame.repaint();
        }

    };
    Timer myTimer2 = new Timer(delay2, taskPerformer2);
    myTimer2.setRepeats(false);
    myTimer2.start();

}

}

public class MyPaint extends JPanel {

private static final long serialVersionUID = 1L;
BufferedImage image;

public MyPaint(BufferedImage image) {
    setOpaque(false);
}


public void paintComponent(Graphics g) {
    super.paintComponent(g);
        g.drawImage(image, 0, 0, 395, 653, this);

}

}

public class PanelPopis extends JPanel {

private static final long serialVersionUID = 7676683627217636485L;

private JButton setLanguage;
private JButton cont;
private JScrollPane scrolPanel;
private JTextArea popis;
private MainWindow mainWindow;

public PanelPopis(MainWindow mainWindow) {
    this.mainWindow = mainWindow;

}

public JPanel setPanel() {

    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    panel.setOpaque(false);

    JPanel panel2 = new JPanel();
    Border border = panel2.getBorder();
    Border margin = new EmptyBorder(0, 0, 4, 0);
    panel2.setBorder(new CompoundBorder(border, margin));

    panel2.setOpaque(false);
    panel2.add(this.scrolPanel = new JScrollPane(popis));

    panel.add(this.setLanguage = new JButton("language settings"),   BorderLayout.NORTH);
    panel.add(this.cont = new JButton("CONTINUE"), BorderLayout.SOUTH);
    panel.add(panel2, BorderLayout.CENTER);

    return panel;

}

}

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,请发帖 minimal reproducible exampleShort, Self Contained, Correct Example。 2) 例如,获取图像的一种方法是热链接到在this Q&A 中看到的图像。
  • 你在 MyPaint 中还有一些其他的东西——在照片上放一张简单的照片不会是一件严肃的事情——显示完整的代码
  • @gpasch “显示完整代码” 不同意。 MCVE 将是最佳的代码形式。请注意,评论中的[mcve] 将自动扩展为minimal reproducible example。 Branislav Pažický - 请不要将代码放在基本上不可读的注释中。它应该作为编辑包含在问题中。
  • 对不起,我改了。
  • 1) 提示:添加@gpasch(或任何重要的@)以通知此人有新评论。 2) 请参阅Detection/fix for the hanging close bracket of a code block 了解我无法再费心修复的问题。但还要注意 a) 不同的代码部分将“一起运行”,除非它们之间有“无代码格式化”部分。我通常使用类的名称作为标题——这样就可以了。 b) 但是要制作正确的 MCVE,它应该只是一个复制/粘贴。这可以通过离开来实现。..

标签: java image swing jpanel


【解决方案1】:

我建议使用 getResource() 方法而不是 getResourceAsStream() 方法,并以这种方式输入两个图像的路径。

classLoader 的行为可能不同(在您的情况下,由于两个操作系统之间的差异),因此这样做可以保证您的应用程序始终获得正确的资源。

这里有更多关于 getResource 的信息:

https://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String)

【讨论】:

  • 我把它改成了 getResource 但还是一样。
  • 对不起,我改了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
相关资源
最近更新 更多