2014-05-23 3 views
0

Следующий код открывает JInternalFrame при нажатии кнопки. Но я хочу, чтобы это окно было открыто один раз, поэтому, если пользователь снова нажмет на эту кнопку, он не откроет другой фрейм, вместо этого он выведет на передний план окно, будет ли оно обозначено, за другим окном и т. Д. Я пробовал пару в основном используя счетчик, но проблемы - это когда кадр закрыт, он тоже не открывает его. Есть ли еще один простой способ сделать это, потому что я не могу заставить его работать правильно. Заранее спасибо.Как открыть внутренний фрейм только один раз

Ниже приведен код, я работаю над:

public class About implements ActionListener{ 

private int openFrameCount; 
private JDesktopPane desk; 
private JTextArea Tarea; 
private JScrollPane scroll; 
private BufferedReader in ; 
int count =0; 
MyInternalFrame frame; 

public About(JDesktopPane desktop) { 
    // TODO Auto-generated constructor stub 
    desk = desktop; 
    System.out.println(count); 
} 

@Override 
public void actionPerformed(ActionEvent arg0) { 
    // TODO Auto-generated method stub 
    count += 1; 

    if(count == 1){ 
    frame = new MyInternalFrame("SAD Imaging"); 
    count +=1; 
    try { 
     in = new BufferedReader(new FileReader("SADInfo.txt")); 
    } catch (FileNotFoundException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    String line; 
    String file = ""; 
    try { 
     while((line = in.readLine()) != null) 
     { 
      System.out.println(line); 
      file += line; 
      file +="\n"; 

     } 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    try { 
     in.close(); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

    Tarea = new JTextArea(); 
    //System.out.println(file); 

    Tarea.setText(file); 
    Font f = new Font("TimesNewRoman", Font.ROMAN_BASELINE, 16); 
    Tarea.setFont(f); 
    Tarea.setBackground(Color.white); 
    Tarea.setAlignmentX(SwingConstants.CENTER); 
    Tarea.setEditable(false); 

    JPanel panel = new JPanel(); 
    panel.add(Tarea); 
    panel.setBackground(Color.white); 

    //scroll = new JScrollPane(Tarea); 
    scroll = new JScrollPane(panel,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 

    frame.add(scroll); 
    frame.setVisible(true); 
    desk.add(frame); 

    try { 
      frame.setSelected(true); 
    } catch (java.beans.PropertyVetoException e) { 

    } 

    } 
    else if(count > 1){ 
     try { 
      //frame.setIcon(true); 
      frame.setMaximum(true); 
      frame.toFront(); 
     } catch (PropertyVetoException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

ответ

1

В принципе, вам просто нужно проверить, чтобы увидеть, если frame является null или нет. Если это так, вы создаете экземпляр, если это не так, вы приносите его вперед, к примеру

@Override 
public void actionPerformed(ActionEvent arg0) { 
    if (frame == null || (frame.getParent() == null && !frame.isIconifiable())) { 
     // Your exitsing code 
    } else { 
     frame.setIcon(false); 
     frame.setSelected(true); 
     frame.moveToFront(); 
    } 

Вы также можете использовать InteralFrameListener к раме, так что вы можете обнаружить, когда рама закрыта, так что вы null внутренний ИОН, например ...

frame.addInternalFrameListener(new InternalFrameAdapter() { 
    @Override 
    public void internalFrameClosing(InternalFrameEvent e) { 
     frame = null; 
    } 
}); 

Обновлены работоспособный пример

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.beans.PropertyVetoException; 
import java.io.File; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.ImageIcon; 
import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JInternalFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestInternalFrame { 

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

    private JInternalFrame imageFrame; 
    private JDesktopPane desktop; 

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

       JMenu fileMenu = new JMenu("File"); 
       JMenuItem newMenu = fileMenu.add("Show..."); 
       newMenu.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         if (imageFrame == null || imageFrame.isClosed()) { 
          imageFrame = new JInternalFrame("Image"); 
          imageFrame.setIconifiable(true); 
          imageFrame.setMaximizable(true); 
          imageFrame.setClosable(true); 
          imageFrame.setResizable(true); 
          JLabel label = new JLabel(new ImageIcon("...")); 
          imageFrame.add(label); 
          imageFrame.pack(); 

          desktop.add(imageFrame); 


          imageFrame.setLocation(0, 0); 
          imageFrame.setVisible(true); 
         } 

         try { 
          imageFrame.setIcon(false); 
          imageFrame.setSelected(true); 
         } catch (PropertyVetoException ex) { 
          ex.printStackTrace(); 
         } 
         imageFrame.moveToFront(); 
        } 
       }); 

       desktop = new JDesktopPane(); 

       JMenuBar mb = new JMenuBar(); 
       mb.add(fileMenu); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setJMenuBar(mb); 
       frame.add(desktop); 
       frame.setSize(1200, 900); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 
+0

Спасибо! Но когда оно обозначено, как я могу сделать его deconified? – selena

+0

Это то, что frame.setIconifiable (false); is for – MadProgrammer

+0

Я пробовал это, но вместо этого он открывает новый кадр, он не выводит тот же фрейм, который был обозначен. – selena

Смежные вопросы