¿Cómo puedo hacer un JFrame de un cierto tamaño, no incluyendo la frontera?

Tengo un JFrame que he establecido para un determinado tamaño, utilizando setBounds. Sin embargo, el que hace de la ventana, incluyendo las fronteras, de ese tamaño (que, en retrospectiva, tiene mucho sentido). Pero lo que yo quiero es que el tamaño de la ventana es ser, es decir, con una resolución de 800×600 más de las fronteras. Esto es importante porque estoy dibujando a un objeto Graphics de la BufferStategy desde el JFrame, pero he estado dibujando debajo de la barra de título cuando se utiliza un valor de y de menos de 20. Me imagino que diferentes sistemas operativos (o incluso de diferentes configuraciones del sistema operativo) puede tener diferentes espesores de las fronteras, también. Pensé que las fronteras eran sólo colgada en una ventana después, pero este no parece ser el caso.

Así, ¿cómo puedo hacer que el espacio dentro de las fronteras de un determinado tamaño, sin importar el grosor de los bordes? También, para hacer mi vida más fácil, ¿cómo puedo hacer que el punto 0, 0 ser la esquina superior izquierda de la visible el contenido de la trama?

Por el camino, utilizando setUndecorated presenta su propios problemas, así que no estoy tratando de que en el momento.

InformationsquelleAutor AlbeyAmakiir | 2011-10-15

6 Kommentare

  1. 6

    Esto es importante porque estoy dibujando a un objeto Graphics de la BufferStategy desde el JFrame,

    ¿Por qué estás usando un BufferStrategy. Que es viejo AWT código. El Swing es de doble buffer por defecto.

    Cuando personalizadas de pintura en el Swing debe extender JPanel (o JComponent) y, a continuación, reemplace el paintComponent() método. Agregar este componente en el panel de contenido del frame. Entonces, si usted sigue kleopatra del consejo que usted no tendrá un problema.

    Ver la sección de la Oscilación tutorial sobre Pintura Personalizada para obtener más información y ejemplos.

    • Oh, así que este es un caso de mí tratando de encontrar una solución para el problema equivocado. El síntoma, no la causa. Voy a ver que sale, y que marca como aceptado si todo va bien.
  2. 16
    1. Establecer un tamaño preferido para el panel de contenido.
    2. Pack el marco.
    3. Trabajo hecho.

    E. G.

    ¿Cómo puedo hacer un JFrame de un cierto tamaño, no incluyendo la frontera?

    import java.awt.*;
    import javax.swing.*;
    
    class FixedSizeContent {
        public static void main(String[] args) {
            SwingUtilities.invokeLater( new Runnable() {
                public void run() {
                    JFrame f = new JFrame("Fixed size content");
                    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    Container c = f.getContentPane();
                    c.setBackground(Color.YELLOW);
                    //adjust to need.
                    Dimension d = new Dimension(400,40);
                    c.setPreferredSize(d);
                    f.pack();
                    f.setResizable(false);
                    f.setVisible(true);
                }
            });
        }
    }
    • Lo siento, esto no soluciona mi problema. Digamos que yo dibuje una línea desde (0, 0) a (100, 100). La línea que comienza donde la parte superior izquierda de la ventana. No el área amarilla en la imagen, pero la propia ventana. La línea no aparecen en la barra de título. Esto significa que cualquier cosa que yo empate entre y = 0 e y = ~25 está oculto por el bar. La solución no cambia eso. Lo hace, sin embargo, hacerlo de modo que, cuando me ve a pantalla completa-de modo exclusivo, nada se dibuja a todos, que es el mismo problema que yo tenía con setUndecorated.
    • «digamos que yo..» ..post un SSCCE de su mejor intento?
    • JaHuhh? Cada vez que veo ese comentario me imagino que tiene que ser una broma, pero no lo entiendo ( y eso me pone triste 🙁 ). ¿A qué te refieres?
    • lo siento, no quiero que triste es alemán, el sonido de un perro hace cuando se sufre <p>
    • Yo tenía un perro una vez. Él nunca hizo un sonido como que. Pero entonces, él nunca sufrió. 😉
  3. 7

    dejar el dibujo componente de informe el tamaño de la gráfica como de su pref

     @Override
     public Dimension getPreferredSize() {
          return new Dimension(myDrawing.getWidth(), myDrawing.getHeight());  
     } 

    a continuación, siga a @Andrew viñetas 2 y 3

    • sus onu-oficial Swing Rulles +1
    • El objeto de Gráficos no tiene un tamaño hasta el tamaño de la ventana se ha establecido, sin embargo. Por lo tanto, estoy de vuelta donde empecé. A menos que me estoy perdiendo algo?
  4. 2

    Usted puede usar esto para evitar el uso de Contenedor.

    JFrame f=new JFrame("Your title");
    
    Dimension d=new Dimension();
    
    d.setSize(x,y);
    
    f.setSize(d); 
  5. 0

    tengo una solución para mi proyecto. Es un hilo viejo, tal vez alguien quiere el código. Pruebe este

    public gfx_CFrame(String _Title, int _Height, int _Width)
    {
        super(_Title);
    
        Dimension Dim = new Dimension(_Width, _Height);
    
        setMaximumSize(Dim);
        setMinimumSize(Dim);
        setPreferredSize(Dim);
        pack();
    
        Dim.width  = _Width  + (getWidth()  - getContentPane().getWidth()); 
        Dim.height = _Height + (getHeight() - getContentPane().getHeight());
    
        setMaximumSize(Dim);
        setMinimumSize(Dim);
        setPreferredSize(Dim);
        pack();
        //....
    }
  6. 0

    Crear Canvas canvas = new Canvas();

    y add(canvas); a la JFrame,

    crear canvas.createBufferStrategy(2);

    obtener BufferStrategy bs = canvas.getBufferStrategy();

    crear Graphics2D graphics2D = (Graphics2D) bufferStrategy.getDrawGraphics();

    dibujar con graphics2D en un BufferedImage.

    mostrar en la pantalla bufferStrategy.show();

    Agregar controles a canvas de todo tipo…

    intentar graphics2D.translate(x,y) para mover el lienzo a una cierta posición
    medido contra los bordes de la ventana Inserciones inserciones de…

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea