JScrollPanes en JInternalFrames de derecha a izquierda - orientaciones de componentes de errores de Java?

StackOverflow https://stackoverflow.com/questions/2004929

Pregunta

Así que he creado un código de demostración, véase más adelante.

Lo que veo es que si un JScrollPane está dentro de un JInternalFrame y orientación componente está puesta a derecha a izquierda, cuando minmising el marco, la barra de desplazamiento se queda a la izquierda del contenido. Yo esperaría, ya que RTL, que se quedaría a la derecha del contenido, lo cual es cierto si el panel de desplazamiento no se añade a un marco interno (ver los dos marcos - aparece uno detrás de otro en la demo).

Así es esto un error de Java o he olvidado de hacer algo?

Aquí está el código de demostración:

import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import java.awt.ComponentOrientation;
import java.awt.Dimension;


public class JScrollBarTest
{
    public static void main(String[] a)
    {
        try
        {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch (Exception e) { }

        runInternalFrameDemo();
        runNormalDemo();
    }

    private static void runInternalFrameDemo()
    {
        // Frame...
        final JFrame frame = new JFrame("Internal Frame Demo");
        frame.setSize(new Dimension(500, 500));
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        // Desktop pane...
        JDesktopPane desktopPane = new JDesktopPane();

        // Table...
        JTable table = getTable();

        // Scroll pane...
        JScrollPane scrollPane = new JScrollPane();

        // Internal frame...
        final JInternalFrame internalFrame = new JInternalFrame("Test Internal Frame", true, true, true, true);
        internalFrame.setSize(400, 300);
        internalFrame.setLocation(50, 50);
        internalFrame.setVisible(true);

        // Add everything...
        frame.setContentPane(desktopPane);
        desktopPane.add(internalFrame);
        internalFrame.setContentPane(scrollPane);
        scrollPane.setViewportView(table);

        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                internalFrame.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
                frame.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
                frame.setVisible(true);
            }
        });
    }

    private static void runNormalDemo()
    {
        // Frame...
        final JFrame frame = new JFrame("Normal Demo");
        frame.setSize(new Dimension(500, 500));
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        // Table...
        JTable table = getTable();

        // Scroll pane...
        JScrollPane scrollPane = new JScrollPane();

        // Add everything...
        frame.setContentPane(scrollPane);
        scrollPane.setViewportView(table);

        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                frame.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
                frame.setVisible(true);
            }
        });
    }

    private static JTable getTable()
    {
        final String[] columns = { "test 1", "test 2", "test 3", "test 4" };
        final Object[][] data = { { "1", "2", "3", "4" }, { "1", "2", "3", "4" } };
        final JTable table = new JTable(data, columns);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        return table;
    }
}

Gracias de antemano.

EDIT:

Disculpas por la falta de claridad -. Escrita en un buen apuro

El problema es que cuando puedo reducir el anchura de la tabla, el 'normal Demo' (no contenido dentro de un JInternalFrame) de la barra de desplazamiento horizontal se inicia a la derecha, en tanto que, haciendo lo mismo para el 'demo marco interno', la barra de desplazamiento horizontal comienza a la izquierda.

¿Alguna idea?

¿Fue útil?

Solución

Como se ha comentado, con Java 1.6 no parece haber una diferencia en el comportamiento de los marcos internos y estándar.

Bug " JScrollPane ignora ComponentOrientation " describe su problema, pero se ha solucionado hace mucho tiempo.

Bug " JScrollPane no Disposición del adecuadamente con RTL (right_to_left) " sigue abierta y podría causar su problema.

he encontrado una solución en Sun foros que hacen que funcione para mí , aunque el problema era ligeramente diferente. barra de desplazamiento vertical aparece en el lado derecho en lugar del izquierdo.

scrollPane.setLayout(new ScrollPaneLayout() {

    @Override
    public void layoutContainer(Container parent) {
        JScrollPane scrollPane = (JScrollPane) parent;
        scrollPane.setComponentOrientation(
          ComponentOrientation.LEFT_TO_RIGHT);
        super.layoutContainer(parent);
        scrollPane.setComponentOrientation(
          ComponentOrientation.RIGHT_TO_LEFT);
    }
});

El comportamiento actual suena como un error para mí, ya que el error (véase más arriba) se ha fijado.

Otros consejos

No estoy seguro de lo que se ve, pero aquí es lo que veo.

texto alternativo http://dl.dropbox.com/u/3608004/jframe .png

En ambos casos, la barra de desplazamiento está a la izquierda (antes y después de reducir al mínimo), y esto es lo correcto. En árabe (de derecha a izquierda langauge) la posición por defecto para las barras de desplazamiento está a la izquierda

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top