Список DisplayModes содержит каждый режим 3 раза - PullRequest
0 голосов
/ 06 декабря 2011

Я пытаюсь получить список доступных режимов отображения для моего ноутбука. Я запускаю следующий код:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice display = ge.getDefaultScreenDevice();
DisplayMode[] availableModes = display.getDisplayModes();

Возвращает 112 возможных режимов отображения. Однако, когда я печатаю список, я вижу много двойников. Все большинство всех режимов отображения печатаются 3 раза. Кто-нибудь знает причину этого?

  • 800x600 8 бит 60 Гц
  • 800x600 8 бит 60 Гц
  • 800x600 8 бит 60 Гц
  • 800x600 16 бит 60 Гц
  • 800x600 16 бит 60 Гц
  • 800x600 16 бит 60 Гц
  • 800x600 32 бит 60 Гц
  • 800x600 32 бит 60 Гц
  • 800x600 32 бит 60 Гц

С уважением

1 Ответ

0 голосов
/ 06 декабря 2011

пожалуйста, попробуйте это с этим кодом

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;


public class DisplayModeModel extends DefaultTableModel {

    private static final long serialVersionUID = 1L;
    private DisplayMode[] modes;

    public DisplayModeModel(DisplayMode[] modes) {
        this.modes = modes;
    }

    public DisplayMode getDisplayMode(int r) {
        return modes[r];
    }

    @Override
    public String getColumnName(int c) {
        return DisplayModeTest.COLUMN_NAMES[c];
    }

    @Override
    public int getColumnCount() {
        return DisplayModeTest.COLUMN_WIDTHS.length;
    }

    @Override
    public boolean isCellEditable(int r, int c) {
        return false;
    }

    @Override
    public int getRowCount() {
        if (modes == null) {
            return 0;
        }
        return modes.length;
    }

    @Override
    public Object getValueAt(int rowIndex, int colIndex) {
        DisplayMode dm = modes[rowIndex];
        switch (colIndex) {
            case DisplayModeTest.INDEX_WIDTH:
                return Integer.toString(dm.getWidth());
            case DisplayModeTest.INDEX_HEIGHT:
                return Integer.toString(dm.getHeight());
            case DisplayModeTest.INDEX_BITDEPTH: {
                int bitDepth = dm.getBitDepth();
                String ret;
                if (bitDepth == DisplayMode.BIT_DEPTH_MULTI) {
                    ret = "Multi";
                } else {
                    ret = Integer.toString(bitDepth);
                }
                return ret;
            }
            case DisplayModeTest.INDEX_REFRESHRATE: {
                int refreshRate = dm.getRefreshRate();
                String ret;
                if (refreshRate == DisplayMode.REFRESH_RATE_UNKNOWN) {
                    ret = "Unknown";
                } else {
                    ret = Integer.toString(refreshRate);
                }
                return ret;
            }
        }
        throw new ArrayIndexOutOfBoundsException("Invalid column value");
    }
}

class DisplayModeTest extends JFrame implements ActionListener, ListSelectionListener {

    private static final long serialVersionUID = 1L;
    private boolean waiting = false;
    private GraphicsDevice device;
    private DisplayMode originalDM;
    private JButton exit = new JButton("Exit");
    private JButton changeDM = new JButton("Set Display");
    private JLabel currentDM = new JLabel();
    private JTable dmList = new JTable();
    private JScrollPane dmPane = new JScrollPane(dmList);
    private boolean isFullScreen = false;
    public static final int INDEX_WIDTH = 0;
    public static final int INDEX_HEIGHT = 1;
    public static final int INDEX_BITDEPTH = 2;
    public static final int INDEX_REFRESHRATE = 3;
    public static final int[] COLUMN_WIDTHS = new int[]{
        100, 100, 100, 100
    };
    public static final String[] COLUMN_NAMES = new String[]{
        "Width", "Height", "Bit Depth", "Refresh Rate"
    };

    public DisplayModeTest(GraphicsDevice device) {
        super(device.getDefaultConfiguration());
        this.device = device;
        setTitle("Display Mode Test");
        originalDM = device.getDisplayMode();
        setDMLabel(originalDM);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        // Make sure a DM is always selected in the list
        exit.addActionListener(this);
        changeDM.addActionListener(this);
        changeDM.setEnabled(device.isDisplayChangeSupported());
    }

    @Override
    public void actionPerformed(ActionEvent ev) {
        Object source = ev.getSource();
        if (source == exit) {
            device.setDisplayMode(originalDM);
            System.exit(0);
        } else { // if (source == changeDM)
            int index = dmList.getSelectionModel().getAnchorSelectionIndex();
            if (index >= 0) {
                DisplayModeModel model = (DisplayModeModel) dmList.getModel();
                DisplayMode dm = model.getDisplayMode(index);
                device.setDisplayMode(dm);
                setDMLabel(dm);
                setSize(new Dimension(dm.getWidth(), dm.getHeight()));
                validate();
            }
        }
    }

    @Override
    public void valueChanged(ListSelectionEvent ev) {
        changeDM.setEnabled(device.isDisplayChangeSupported());
    }

    private void initComponents(Container c) {
        setContentPane(c);
        c.setLayout(new BorderLayout());        
        JPanel currentPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));// Current DM
        c.add(currentPanel, BorderLayout.NORTH);
        JLabel current = new JLabel("Current Display Mode : ");
        currentPanel.add(current);
        currentPanel.add(currentDM);        
        JPanel modesPanel = new JPanel(new GridLayout(1, 2));// Display Modes
        c.add(modesPanel, BorderLayout.CENTER);       
        for (int i = 0; i < COLUMN_WIDTHS.length; i++) { // List of display modes
            TableColumn col = new TableColumn(i, COLUMN_WIDTHS[i]);
            col.setIdentifier(COLUMN_NAMES[i]);
            col.setHeaderValue(COLUMN_NAMES[i]);
            dmList.addColumn(col);
        }
        dmList.getSelectionModel().setSelectionMode(                ListSelectionModel.SINGLE_SELECTION);
        dmList.getSelectionModel().addListSelectionListener(this);
        modesPanel.add(dmPane);        
        JPanel controlsPanelA = new JPanel(new BorderLayout());// Controls
        modesPanel.add(controlsPanelA);
        JPanel controlsPanelB = new JPanel(new GridLayout(2, 1));
        controlsPanelA.add(controlsPanelB, BorderLayout.NORTH);        
        JPanel exitPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));// Exit
        controlsPanelB.add(exitPanel);
        exitPanel.add(exit);        
        JPanel changeDMPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));// Change DM
        controlsPanelB.add(changeDMPanel);
        changeDMPanel.add(changeDM);
        controlsPanelA.add(new JPanel(), BorderLayout.CENTER);
    }

    @Override
    public void setVisible(boolean isVis) {
        super.setVisible(isVis);
        if (isVis) {
            dmList.setModel(new DisplayModeModel(device.getDisplayModes()));
        }
    }

    private void setDMLabel(DisplayMode newMode) {
        int bitDepth = newMode.getBitDepth();
        int refreshRate = newMode.getRefreshRate();
        String bd, rr;
        if (bitDepth == DisplayMode.BIT_DEPTH_MULTI) {
            bd = "Multi";
        } else {
            bd = Integer.toString(bitDepth);
        }
        if (refreshRate == DisplayMode.REFRESH_RATE_UNKNOWN) {
            rr = "Unknown";
        } else {
            rr = Integer.toString(refreshRate);
        }
        currentDM.setText(
                COLUMN_NAMES[INDEX_WIDTH] + ": " + newMode.getWidth() + " "
                + COLUMN_NAMES[INDEX_HEIGHT] + ": " + newMode.getHeight() + " "
                + COLUMN_NAMES[INDEX_BITDEPTH] + ": " + bd + " "
                + COLUMN_NAMES[INDEX_REFRESHRATE] + ": " + rr);
    }

    public void begin() {
        isFullScreen = device.isFullScreenSupported();
        setUndecorated(isFullScreen);
        setResizable(!isFullScreen);
        if (isFullScreen) {           
            device.setFullScreenWindow(this); // Full-screen mode
            validate();
        } else {            
            pack();// Windowed mode
            setVisible(true);
        }
    }

    public static void main(String[] args) {
        GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] devices = env.getScreenDevices();
        // REMIND : Multi-monitor full-screen mode not yet supported
        for (int i = 0; i < 1 /* devices.length */; i++) {
            DisplayModeTest test = new DisplayModeTest(devices[i]);
            test.initComponents(test.getContentPane());
            test.begin();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...