【问题标题】:Adding textfields to jframe using graphics2d使用 graphics2d 将文本字段添加到 jframe
【发布时间】:2014-10-19 18:07:32
【问题描述】:
public class Contact {
   int x0,x1,y2=1500,x3=1500,a=0;
   JFrame jf;
   private JTextField name = new JTextField();
   private JTextField phone;
   private JButton start;
   boolean clicked=false;

   static Dimension dim=Toolkit.getDefaultToolkit().getScreenSize();
   static int w=(int)dim.getWidth();    static int h=(int)dim.getHeight();
   IntroInner d=new IntroInner();   int c;

   public Contact() {

   }

   public void build() throws Exception{

      jf=new JFrame("THE COUNTRY CLUB");
      jf.getContentPane().add(d);
      jf.setSize(w,h);
      jf.setVisible(true);
      jf.setAlwaysOnTop(true);
      jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
   }

   public class IntroInner extends JPanel{

      public void paintComponent(Graphics g1){

        Graphics2D g=(Graphics2D) g1;

        FontMetrics metrics = g.getFontMetrics();
        int xpos=(int)Toolkit.getDefaultToolkit().getScreenSize().getWidth()/2-215;

        setFont(new Font("serif",Font.ITALIC,40));

        g.setColor(Color.black);
        g.fillRect(0,0,this.getWidth(),this.getHeight());

        Image im1=new ImageIcon("Images/bg.jpg").getImage();
        g.drawImage(im1,0,0,this);

        //g.rotate(a);
        Image im=new ImageIcon("Images/logo.png").getImage();
        g.drawImage(im,xpos,50,this);

        g.setColor(Color.white);

        g.drawString("Please Enter Your Details",400,400);

        g.drawString("Name:",400,475);

        g.drawString("Contact No:",400,550); 
     }
  }

  public static void main(String[] args) throws Exception{
      new Contact().build();
  }
}

关于在 java 中使用 graphics2d 实现文本字段到 java 框架,我提出了很多建议。但没有得到任何有用的意见。我也在stackoverflow中找到了一些东西。但这也没有帮助我。任何人都可以在这方面帮助我。该程序的预期输出如下所示:提前致谢。

【问题讨论】:

  • 您能解释一下为什么在已经有可以为您完成这项工作的全功能组件的情况下要这样做吗?
  • I reffered alot about implementing textfield to java frame using graphics2d in java - 我完全不知道那句话是什么意思。图形用于在 GUI 上绘制一些东西。文本字段用于接受键盘输入。这两个概念有什么关系?

标签: java swing textfield graphics2d


【解决方案1】:

好的,所以你可能需要退后一步,看看这里的两个方面:

  • 一方面是您可以直接在 Graphics2D 对象上绘图、打印字符串、绘制线条、填充矩形等...虽然这在某些情况下可能非常有趣(例如,如果您想要执行非常自定义的绘图),这是一种非常低级的方法。你负责做很多事情。如果您考虑处理文本字段,这意味着您必须在键入时绘制背景、边框、字符串、闪烁的插入符号等……这很容易变得非常麻烦且难以维护
  • 另一方面,Swing 提供了一堆组件,这些组件已经完成了我刚才谈到的所有繁琐工作。虽然它不能处理所有情况,但简单的情况,如标签、文本字段、图像等......已经有一个内置的实现,基本上可以避免你自己做繁琐的工作。剩下的唯一事情就是解释您希望组件出现的方式和位置。这就是 LayoutManager 发挥作用的地方。

这是一个小例子(在许多其他例子中),它向您展示了做这种事情的要点:

import java.awt.BorderLayout;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;


public class BasicSwingTest {

    protected void initUI() throws MalformedURLException {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JLabel image  = new JLabel(new ImageIcon(new URL("http://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Duke3D.png/220px-Duke3D.png")));
        frame.setLayout(new BorderLayout());
        frame.add(image, BorderLayout.WEST);
        JPanel mainPanel = new JPanel(new GridBagLayout());
        JPanel panel = new JPanel(new GridLayout(0, 2));
        panel.add(new JLabel("Name: "));
        JTextField name = new JTextField(20);
        panel.add(name);
        panel.add(new JLabel("Contact no: "));
        JTextField contactNumber = new JTextField(15);
        panel.add(contactNumber);
        panel.setBorder(BorderFactory.createTitledBorder("Enter your details"));
        mainPanel.add(panel);
        frame.add(mainPanel);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    new BasicSwingTest().initUI();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
            }
        });
    }


}

结果:

这里是第二个例子(看起来有点像你的图像,虽然它需要一些调整):

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class BasicSwingTest2 {

    private static final Font FONT = new Font("Times New Roman", Font.PLAIN, 18);

    protected void initUI() throws MalformedURLException {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());

        JLabel contentPane = new JLabel(new ImageIcon(new URL("http://www.pd4pic.com/images/blue-background-simple.jpg")));
        contentPane.setLayout(new BorderLayout());
        frame.add(contentPane, BorderLayout.CENTER);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weightx = 0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.anchor = GridBagConstraints.WEST;
        JPanel panel = new JPanel(new GridBagLayout());
        panel.setOpaque(false);
        JTextField name = new JTextField(20);
        JTextField contactNumber = new JTextField(15);

        panel.add(getLabel("Name: "), gbc);
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        panel.add(name, gbc);
        gbc.gridwidth = GridBagConstraints.RELATIVE;
        panel.add(getLabel("Contact no: "), gbc);
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        panel.add(contactNumber, gbc);

        JLabel topLabel = getLabel("Please enter you details");
        topLabel.setHorizontalAlignment(JLabel.CENTER);
        contentPane.add(topLabel, BorderLayout.NORTH);
        contentPane.add(panel, BorderLayout.CENTER);

        frame.pack();
        frame.setVisible(true);
    }

    private JLabel getLabel(String text) {
        JLabel label = new JLabel(text);
        label.setFont(FONT);
        label.setForeground(Color.WHITE);
        return label;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    new BasicSwingTest2().initUI();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
            }
        });
    }

}

【讨论】:

  • 感谢您的即时帮助。但是请您再次检查我的问题。它是 graphics2d 的一部分。
  • @thampijoseph 抱歉,但我不明白您为什么要如此努力地使用 graphics2d。您应该深入地重新阅读我的答案,并尝试理解它所说的内容。您不需要使用 Graphics2D 来实现您展示的图片。使用 Swing 组件可以轻松实现。
  • 这是我从客户端得到的要求,他们还没有准备好妥协:(
  • @thampijoseph 使用 Swing 组件意味着您最终将使用 Graphics2D。唯一的事情是让 Swing 组件与 Graphics2D 一起工作。通过使用 Swing 组件,您可以获得更高、更简单的级别。如果你想自己做,你要做的就是尝试做和 Swing 组件一样的事情,而且做起来很可能不如 Swing 做的好。使用 Swing 绝不是妥协,它只是让您的生活更轻松,并且仍在使用 Graphics2D。
  • @thampijoseph 另请参阅我的编辑和我在末尾附加的新示例。它看起来或多或少像您的示例图像。需要一些调整,但基本的想法就在那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多