【问题标题】:Insert a GIF image into JFrame and make it visible and invisible on demand将 GIF 图片插入 JFrame 并按需使其可见和不可见
【发布时间】:2015-02-19 05:21:51
【问题描述】:

在我的应用程序中,我从项目数据库中提取数据。当我这样做时,我想向用户发出数据提取正在进行中的信号。我想通过使当前帧view.getFrame2() 不可见并使view.getFrame3() 可见来实现这一点。第 3 帧将有 GIF 图像,帧标题为“正在提取”。我能够实现我的目标,但我无法查看框架中的图像。一片空白。

下面是我正在使用的代码 sn-p;一个类用于视图,另一个用于控制器,另一个用于模型。我还有一个主类来初始化所有的 M-V-C 类。我不想通过创建更多类来使代码复杂化。

查看

My View class:-
/** View**/
package mvc.views;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

import javax.swing.*;

public class View {
 JFrame frame2, frame3;
  JPanel  panel3;
  Toolkit tk; 
  Image   icon;
  Color   background;
  public View() {
 /** processing image view **/

    frame3 =new JFrame();

    frame3.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    frame3.setTitle( "Extraction in process...." );

      try {
            icon = new ImageIcon("C:\\Users\\pc033k\\Desktop\\gears_animated.gif").getImage();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 


    panel3 = new JPanel();
    background = Color.white;
    panel3.setOpaque(true);
    frame3.setContentPane(panel3);;            
    frame3.setBounds(100, 100, 400, 400);
    frame3.setLocationRelativeTo(null);
    frame3.setVisible(false);
    /** End of processing image view **/ 
}
public void paint (Graphics g)
  {
    panel3.paint(g);

    panel3.setBackground(background);
    g.drawImage(icon,100,100,500,500,null);

    }
 } 
 /** End of View**/

控制器

/** Start Controller**/
package mvc.controllers;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

import javax.swing.JTextField;

import mvc.models.*;
import mvc.views.*;
public class Controller {
 public Model model;
 public View view;
 public ActionListener myButtonListener;
 //public MyDateListener listener;
 boolean status, process1;
 public String user, password, FN, LN, type;

 JTextField text1, text2;
 JCalendarCombo cal1, cal2;


 public Date date1, date2;

 public Controller(Model model, View view) {

    this.model = model;
    this.view = view;
}

    public class MyButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {

            if(e.getSource() == view.getGetcrmdataButton()){

                FN = view.getUserText1().getText();
                LN = view.getUserText2().getText();
                date1 = view.getCalendar2().getDate();
                date2 = view.getCalendar3().getDate();
                type = (String) view.getComb1().getSelectedItem();
                view.getFrame2().dispose();
                view.getFrame3().setVisible(true);
                view.getFrame3().repaint();



                try {
                     process1 = model.CRMDataExtract(FN, LN, date1, date2, type);

                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }

                if(process1 == true){

                    view.getFrame3().setVisible(false);
                    view.getFrame2().setVisible(true);
                    JOptionPane.showMessageDialog((Component) (e.getSource()),
                            "pealse Check the output file for the data");



                }
                else
                {
                    view.getFrame3().setVisible(false);
                    view.getFrame2().setVisible(true);
                    JOptionPane.showMessageDialog((Component) (e.getSource()),
                            " No Records found or Data Extraction failed!!");
                }



            }


    }

}

【问题讨论】:

  • 1) 请参阅The Use of Multiple JFrames, Good/Bad Practice? 2) 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。
  • BTW - “将 GIF 图像插入 JFrame 并按需使其可见和不可见” 最简单的方法是在 JLabel 中显示图像。要使其不可见,请设置一个与原始图像大小相同但完全透明的新图标(例如new BufferedImage(w,h,BufferedImage.TYPEE_INT_ARGB))。
  • @Andrew Thompson 感谢您的建议。我会努力在我未来的发展中实现。

标签: java swing jframe paint imageicon


【解决方案1】:

您可以使用标签来插入图像。 另外我认为 CardLayout 更适合你的工作。这是一些示例代码。考虑 Sample 是一个 JFrame。当您按下“下一步”按钮时,您将看到面板发生变化。

 public Sample() {

        p = new JPanel();
        p.setLayout(new CardLayout());

        p1 = new JPanel();
        p1.setLayout(new BorderLayout());
        p1.add(new JLabel(new ImageIcon(new URL("http://icons.iconarchive.com/icons/chrisbanks2/cold-fusion-hd/128/ace-of-spades-icon.png"))));

        p2 = new JPanel();
        p2.setLayout(new BorderLayout());
        p2.add(new JLabel(new ImageIcon(new URL("http://icons.iconarchive.com/icons/chrisbanks2/cold-fusion-hd/128/ace-of-hearts-icon.png"))));

        p3 = new JPanel();
        p3.setLayout(new BorderLayout());
        p3.add(new JLabel(new ImageIcon(new URL("http://icons.iconarchive.com/icons/chrisbanks2/cold-fusion-hd/128/angrybirds-2-icon.png"))));

        p.add(p1, "0");
        p.add(p2, "1");
        p.add(p3, "2");

        b = new Button("Next");
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                rotator++;
                if (rotator == 3) {
                    rotator = 0;
                }
                CardLayout layout = (CardLayout) p.getLayout();
                layout.show(p, "" + rotator);
                System.out.println("Rotator " + rotator);

            }
        });

        add(p, "Center");
        add(b, "North");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

【讨论】:

  • 嗨 Lalith,您的建议对我未来开发该工具很有帮助,我会记住您的建议 :)
【解决方案2】:

我想通过使当前框架 view.getFrame2() 不可见并使 view.getFrame3() 可见来实现这一点。

不要隐藏/显示不同的窗口。用户不喜欢框架消失。相反,您可以简单地在主框架顶部显示一个包含您的图像的模态 JDialog。

或者另一种方法是使用GlassPane 在主框架顶部绘制。有关此方法的示例,请参阅 Disabled Glass Pane。现有示例不使用图标,但您可以轻松更改它。

【讨论】:

  • 您的 JDialog 想法更适合我,谢谢。但是我的程序不会进一步移动,直到我在对话框上按确定。如果我的程序在我的对话框出现时按原样执行,我该怎么办?
  • @pardhu,您需要使用“非模态”JDialog。阅读 API 以获取更多信息。构造函数有一个您可以设置的属性,或者您可以在创建对话框之后(但在使其可见之前)设置该属性。
  • 我可以为 JOptionPane 使用“非模态”吗?如果有怎么办?
  • 顺便说一下,我尝试为 JDialog 组件设置非模态。但它即将空白。我怀疑这种情况正在发生,因为我的控件正忙于执行我的模型类。我们有解决方案吗?
  • @pardhu,阅读 JOptionPane API。它向您展示了直接创建选项窗格并在对话框中使用它所需的手动代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多