Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java旋转非方形JPanel组件_Java_Swing_User Interface_Rotation_Awt - Fatal编程技术网

Java旋转非方形JPanel组件

Java旋转非方形JPanel组件,java,swing,user-interface,rotation,awt,Java,Swing,User Interface,Rotation,Awt,由于操作系统的限制,我试图旋转一个充满文本标签的GridLayout来模拟纵向视图。它们所在的JPanel不是方形的,因此当旋转90度时,标签会根据JPanel的尺寸被切断。是否可以根据旋转调整布局大小,使其仍然适合JPanel?对这一点的研究表明,旋转有很多选择,但仅适用于方形板 为了进一步解释我的问题:当我旋转内部绘制的标签时,它们的格式保持为法线方向的x,y,我希望它将布局的格式设置为适合90度旋转的x,y(因此基本上y和x是翻转的)。目前,我的网格的一部分在旋转后被切断。此外,最终显示应

由于操作系统的限制,我试图旋转一个充满文本标签的GridLayout来模拟纵向视图。它们所在的JPanel不是方形的,因此当旋转90度时,标签会根据JPanel的尺寸被切断。是否可以根据旋转调整布局大小,使其仍然适合JPanel?对这一点的研究表明,旋转有很多选择,但仅适用于方形板

为了进一步解释我的问题:当我旋转内部绘制的标签时,它们的格式保持为法线方向的x,y,我希望它将布局的格式设置为适合90度旋转的x,y(因此基本上y和x是翻转的)。目前,我的网格的一部分在旋转后被切断。此外,最终显示应适合当前JPnel中填写的所有13×24个字母

编辑:使用模糊的注释表示我需要在旋转后进行绘制,但这样做会修剪网格,不会填充回我喜欢的大小

JPanel代码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Screen extends JPanel {

   private JLabel[][] labels = new JLabel[13][24];
   private GridLayout layout;

   public Screen() {

      //setLocation(315,35);
      layout = new GridLayout(13, 24);
      layout.preferredLayoutSize(this);
      //setBounds(315, 65, 243, 350);
      setBounds(315, 65, 243, 350);
      setLayout(layout);

      for (int i = 0; i < 13; i++) {
         for (int j = 0; j < 24; j++) {
            labels[i][j] = new JLabel();
            labels[i][j].setBackground(Color.BLACK);
            add(labels[i][j]);
         }
      }

      //testing new letter
      for (int i = 0; i < 13; i++) {
         for (int j = 0; j < 24; j++) {
            labels[i][j].setText("T");
            labels[i][j].setForeground(Color.GREEN);
         }
      }

      setBackground(Color.black);
      setVisible(true);
      repaint();
   }

   @Override
   public void paintComponent(Graphics g) {
      //Rotates screen graphics to correct orientation
      Graphics2D g2d = (Graphics2D) g;
      int w2 = getWidth() / 2;
      int h2 = getHeight() / 2;
      g2d.rotate(Math.PI / 2, w2, h2);

      super.paintComponent(g);
      setSize(243,350);

   }
}

旋转部件的过程比仅绘制旋转后的图像更复杂。有许多相互连接的层产生合同义务

例如,被设置为组件的当前大小的“剪切矩形”的大小被设置为“代码”>图形< /代码>上下文,该大小由布局管理器计算,但可以考虑单个组件的首选大小…

这是需要考虑的大量重新布线…称我为lazy,但如果我能找到现成的解决方案,我更愿意使用它,因此基于,我可以生成以下内容

字段面板周围的红色
LineBorder
表示整个组件已旋转,而不仅仅是子组件。
pack
的使用还表明,该解决方案仍在履行其对API其余部分的合同义务

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;
import org.jdesktop.jxlayer.JXLayer;
import org.pbjar.jxlayer.demo.TransformUtils;
import org.pbjar.jxlayer.plaf.ext.transform.DefaultTransformModel;

public class RotateExample {

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

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

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new ExamplePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ExamplePane extends JPanel {

        private FieldPane fieldPane;
        private DefaultTransformModel transformModel;

        private JButton rotate;
        private double angle;

        public ExamplePane() {

            setLayout(new BorderLayout());

            rotate = new JButton("Rotate");
            rotate.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    transformModel.setRotation(Math.toRadians((angle += 90)));
                    SwingUtilities.getWindowAncestor(ExamplePane.this).pack();
                }
            });


            fieldPane = new FieldPane();

            transformModel = new DefaultTransformModel();
            transformModel.setRotation(Math.toRadians(0));
            transformModel.setScaleToPreferredSize(true);
            JXLayer<JComponent> rotatePane = TransformUtils.createTransformJXLayer(fieldPane, transformModel);

            JPanel content = new JPanel(new GridBagLayout());
            content.add(rotatePane);

            add(rotate, BorderLayout.SOUTH);
            add(content);

        }
    }

    public class FieldPane extends JPanel {

        public FieldPane() {
            setBorder(new LineBorder(Color.RED));
            setLayout(new GridBagLayout());

            JTextField field = new JTextField(10);
            field.setText("Hello world");

            add(field);

        }
    }
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.EventQueue;
导入java.awt.GridBagLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JTextField;
导入javax.swing.SwingUtilities;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.border.LineBorder;
导入org.jdesktop.jxlayer.jxlayer;
导入org.pbjar.jxlayer.demo.TransformUtils;
导入org.pbjar.jxlayer.plaf.ext.transform.DefaultTransformModel;
公共类循环示例{
公共静态void main(字符串[]args){
新的RotateeExample();
}
公共旋转示例(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(新的ExamplePane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类ExamplePane扩展了JPanel{
专用字段窗格字段窗格;
私有模式转换模式;
私人按钮旋转;
私人双角度;
公共示例窗格(){
setLayout(新的BorderLayout());
旋转=新按钮(“旋转”);
rotate.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
变换模型。设定旋转(数学。托拉半径((角度+=90));
SwingUtilities.getWindowSenator(ExamplePane.this.pack();
}
});
fieldPane=新的fieldPane();
transformModel=新的DefaultTransformModel();
变换模型.集合旋转(数学.托拉迪安(0));
transformModel.setScaleToPreferredSize(真);
JXLayer rotatePane=TransformUtils.createTransformJXLayer(fieldPane,transformModel);
JPanel content=newJPanel(newGridBagLayout());
内容。添加(rotatePane);
添加(旋转,边界布局。南);
增加(内容);
}
}
公共类FieldPane扩展了JPanel{
公共字段窗格(){
设置顺序(新的线边框(颜色为红色));
setLayout(新的GridBagLayout());
JTextField=新的JTextField(10);
field.setText(“你好世界”);
添加(字段);
}
}
}
注意事项

这需要(我使用的是版本3),(我使用的是版本1.6.4)和Piet Blok的优秀示例,这些示例在网络上似乎不再可用

我已经将JXLayer(版本3)的所有源代码和Piet的示例放在一个单独的文件中,我建议,如果您感兴趣,您可以获取一份副本并将其存储在安全的地方

你还需要

已更新

并使用
屏幕
面板(无自定义绘制)


您所说的“旋转”是什么意思?行中的标签现在是否在列中?当前旋转代码在哪里?请查看paint component@Override方法。他/她正在做一些类似于旋转整个屏幕的事情,只是它只是一个组件(GridLayout),这会让你心神不宁;)@程序员,你的意思是,有没有更好的方法来做这件事?首先,看看这个
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;
import org.jdesktop.jxlayer.JXLayer;
import org.pbjar.jxlayer.demo.TransformUtils;
import org.pbjar.jxlayer.plaf.ext.transform.DefaultTransformModel;

public class RotateExample {

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

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

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new ExamplePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ExamplePane extends JPanel {

        private FieldPane fieldPane;
        private DefaultTransformModel transformModel;

        private JButton rotate;
        private double angle;

        public ExamplePane() {

            setLayout(new BorderLayout());

            rotate = new JButton("Rotate");
            rotate.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    transformModel.setRotation(Math.toRadians((angle += 90)));
                    SwingUtilities.getWindowAncestor(ExamplePane.this).pack();
                }
            });


            fieldPane = new FieldPane();

            transformModel = new DefaultTransformModel();
            transformModel.setRotation(Math.toRadians(0));
            transformModel.setScaleToPreferredSize(true);
            JXLayer<JComponent> rotatePane = TransformUtils.createTransformJXLayer(fieldPane, transformModel);

            JPanel content = new JPanel(new GridBagLayout());
            content.add(rotatePane);

            add(rotate, BorderLayout.SOUTH);
            add(content);

        }
    }

    public class FieldPane extends JPanel {

        public FieldPane() {
            setBorder(new LineBorder(Color.RED));
            setLayout(new GridBagLayout());

            JTextField field = new JTextField(10);
            field.setText("Hello world");

            add(field);

        }
    }
}