【问题标题】:JFileChooser showing outside Full screened JFrameJFileChooser 在全屏 JFrame 之外显示
【发布时间】:2012-12-26 18:02:19
【问题描述】:
import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Sample {
    public static String audioName;
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setTitle("Frame");
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        device.setFullScreenWindow(frame);
        device.setDisplayMode(new DisplayMode(800, 600, 32, 60));
        frame.setVisible(true);

        JButton btn = new JButton();
        btn.setText("Button");
        JPanel panel = new JPanel();

        panel.add(btn);
        frame.add(panel);
        btn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser chooser = new JFileChooser();
                int returnName = chooser.showOpenDialog(frame);
                if (returnName == JFileChooser.APPROVE_OPTION) {
                    System.out.println("Sample");
                }
            }
        });
    }
}

如何在全屏中显示 JFileChooser?我不熟悉 JInternalFrame/JDesktopPane,你认为这会解决这个问题还是有其他方法可以解决这个问题?

【问题讨论】:

  • 如果 Java 应用程序更改了我的 Windows 显示设置,我将永远不会再使用该应用程序。
  • @GilbertLeBlanc,java 仅在运行应用程序时临时更改它。
  • @GilbertLeBlanc 可能已经注意到了同样的效果,这让我对这段代码非常恼火。每次我运行它时,它都会强制将 2 个 WinAmp 屏幕从我通常所在的屏幕最右侧移到新屏幕尺寸的约束中。这让我意识到,全屏模式似乎每一步都在吸引你。这个应用程序有什么如此重要。它应该是“全屏”吗?
  • @Andrew Thompson:我对全屏 Java 应用程序没有意见。我确实对有人更改我的显示设置有疑问。在进一步审查中,如果我的组织中的任何人编写了一个更改我的显示分辨率的 Java 应用程序,我会去打他们的废话,直到我被保安枪杀或被扔出大楼。
  • “我对全屏 Java 应用程序没有意见。” OP 是。看看他们的问题历史。

标签: java swing jframe fullscreen jfilechooser


【解决方案1】:

在装有 Java 6 的 Windows XP 计算机上,JFileChooser 位于框架的中心。我将框架移动到两台显示器上的不同位置。

我注释掉了更改显示设置的行,并修复了一些其他问题。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Sample implements Runnable {
    public static String    audioName;

    public void run() {
        final JFrame frame = new JFrame();
        frame.setTitle("Frame");
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//      GraphicsDevice device = GraphicsEnvironment
//              .getLocalGraphicsEnvironment().getDefaultScreenDevice();
//      device.setFullScreenWindow(frame);
//      device.setDisplayMode(new DisplayMode(800, 600, 32, 60));

        JButton btn = new JButton();
        btn.setText("Button");
        JPanel panel = new JPanel();

        panel.add(btn);
        frame.add(panel);
        frame.setExtendedState(
                frame.getExtendedState() | JFrame.MAXIMIZED_BOTH);
        btn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser chooser = new JFileChooser();
                int returnName = chooser.showOpenDialog(frame);
                if (returnName == JFileChooser.APPROVE_OPTION) {
                    System.out.println("Sample");
                }
            }
        });
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Sample());
    }
}

如果您想最大化您的JFrame,请在您的setVisible 方法之前的某处添加以下语句。

frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH);

【讨论】:

    【解决方案2】:

    我建议不要使用弹出窗口,而是将JFileChooser 嵌入到您的应用程序中。它会使您的代码更长一点,但从我的角度来看,在无窗口应用程序中弹出窗口并没有什么意义(就我个人而言,我不太喜欢弹出窗口)。

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class FullScreenApp {
    
        public static void main(String[] args) {
            final JFrame frame = new JFrame();
            frame.setTitle("Frame");
            frame.setSize(800, 600);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
            device.setFullScreenWindow(frame);
            device.setDisplayMode(new DisplayMode(800, 600, 32, 60)); // Ugh.
            frame.setVisible(true);
    
            final Box panel = Box.createVerticalBox();
            JButton btn = new JButton();
            btn.setText("Button");
    
            panel.add(btn);
            frame.add(panel);
    
            final CustomFileChooser chooser = new CustomFileChooser(panel);
    
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                   chooser.show();
                }
            });
        }
    
        public static class CustomFileChooser extends JFileChooser{
             /** Node this chooser should be added to.
              *  There's likely a better way of doing this, 
              *  but it was convenient for a quick example */
            Container parent;
    
            public CustomFileChooser(Container parent){
                super();
                this.parent = parent;
                //Make configurations for your file chooser
                setApproveButtonText("Open");
            }
    
            @Override
            public void approveSelection(){
                super.approveSelection();
                //Perform accept action here
                System.out.println(getSelectedFile().getAbsolutePath());
                parent.remove(CustomFileChooser.this);
                parent.repaint();
            }
    
            @Override
            public void cancelSelection(){
                super.cancelSelection();
                //Perform cancel action here
                System.out.println("Canceled");
                parent.remove(CustomFileChooser.this);
                parent.repaint();
            }
    
            @Override
            public void show(){
                 rescanCurrentDirectory();
                 parent.add(this);
                 revalidate();
                 repaint();
            }
    
            @Override
            public Dimension getMaximumSize(){
                //Not necessary - But I felt the chooser should have a maximum size
                return new Dimension(500,300);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多