【问题标题】:Jframe image + textfieldJframe图像+文本字段
【发布时间】:2012-07-26 02:13:12
【问题描述】:

您好,我正在尝试制作一个显示图像的简单框架,一个文本字段和一个按钮,但由于某种原因,文本字段是不可见的,因为我对 java 非常陌生,甚至更擅长这些图形的东西,你能帮忙吗:) 代码

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package solverapplet;

 import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import javax.swing.JTextField;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import sun.misc.BASE64Decoder;

public class AwtImage extends Frame{
  Image img;
  String base="R0lGODlhDwAPAKECAAAAzMzM/////wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==";
  /*public static void main(String[] args){
  AwtImage ai = new AwtImage();
  }*/
  public void setbase(String a){
  this.base=a;

  }
  public void refreshimage(){
        try {
            BASE64Decoder decoder = new BASE64Decoder();  
                      byte[] imgBytes = decoder.decodeBuffer(this.base);          

                      BufferedImage bufImg = ImageIO.read(new ByteArrayInputStream(imgBytes));  
                      //File imgOutFile = new File("newLabel.png");  
                      //ImageIO.write(bufImg, "png", imgOutFile);
                      img = bufImg;
        } catch (IOException ex) {
            Logger.getLogger(AwtImage.class.getName()).log(Level.SEVERE, null, ex);
        }

  }
  public AwtImage(){
  super("Solve");
        try {
            BASE64Decoder decoder = new BASE64Decoder();  
            byte[] imgBytes = decoder.decodeBuffer(this.base);          

            BufferedImage bufImg = ImageIO.read(new ByteArrayInputStream(imgBytes));  



            MediaTracker mt = new MediaTracker(this);


          img=bufImg;
          mt.addImage(img,0);
          JTextField textfield= new JTextField("Text field 2", 8);
          add(textfield,"South");
          setSize(400,400);
          //pack();
          setVisible(true);
          addWindowListener(new WindowAdapter(){
          public void windowClosing(WindowEvent we){
          dispose();
          }
          });
        } catch (IOException ex) {
            Logger.getLogger(AwtImage.class.getName()).log(Level.SEVERE, null, ex);
        }
  }
  public void update(Graphics g){
  paint(g);
  }

  public void paint(Graphics g){
  if(img != null)
  g.drawImage(img, 100, 100, this);
  else
  g.clearRect(0, 0, getSize().width, getSize().height);
  }
}

它被另一个类实例化。

【问题讨论】:

  • 我建议不要写add(textfield, "South");,而是写add(textfield, BorderLayout.SOUTH); 这有两个目的:a)它使你的代码万无一失,因为任何打字错误都会在编译时出现 b)它作为一种隐式文档,这意味着它很容易理解。我可以看一下第二个选项,并立即知道您正在使用什么 LayoutManager 以及您正在使用文本字段做什么。
  • 你没有使用 JFrame,你使用的是 java.awt.Frame,有很大的不同

标签: java swing awt frame mixing


【解决方案1】:

问题是,您在没有调用 super 的情况下覆盖了 paint 方法,这意味着它永远没有机会进行绘制。

public void paint(Graphics g){
    if(img != null)
        g.drawImage(img, 100, 100, this);
    else
        g.clearRect(0, 0, getSize().width, getSize().height);
}

当使用java.awt.Frame 时,您会发现很难实现自己的目标。 java.swingx.JFrame 允许您覆盖 paintComponent 方法,该方法允许您绘制组件的背景,但 java.awt.Frame 不能。

您还应该避免混合轻量和重量的组件(我知道,这显然是固定的),但如果可以的话,尽量避免。

【讨论】:

    猜你喜欢
    • 2015-07-03
    • 2015-08-19
    • 2018-04-27
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    相关资源
    最近更新 更多