2

開発中のこのコンポーネントに視覚的な問題があります。JPanel2 つの JTextField と 2 つの JLabelsがあります。ベタ背景が作れません。不透明色と背景色の組み合わせをいくつか試しましたが、成功しませんでした。

画像を添付することは許可されていないため、サンプル画像はこちらです!:

何か助けてください。

package javaapplication1;

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;

public class JavaApplication1 {

public static void main(String[] args) {
    try {
        for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (Exception e) {
    }
    JFrame testFrame = new JFrame("Test Frame");
    testFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    JDecimal decimal = new JDecimal();
    decimal.setPreferredSize(new Dimension(300, 100));
    testFrame.setLayout(null);
    testFrame.getContentPane().add(decimal);
    decimal.setSize(80, 25);
    testFrame.setLocationRelativeTo(null);
    testFrame.setSize(300, 200);
    testFrame.setVisible(true);
}

public static class JDecimal extends JPanel {

    private String currencyString = "00";
    private java.text.DecimalFormat format = (java.text.DecimalFormat) java.text.DecimalFormat.getInstance();
    JTextField integerField = new JTextField();
    JLabel comaLabel = new JLabel();
    JTextField fractionField = new JTextField();
    JLabel plusMinusLabel = new JLabel();
    JDecimalLayout JDecimalLayout = new JDecimalLayout();

    public JDecimal() {
        init();
    }

    public String getText() {
        return integerField.getText() + "." + fractionField.getText();
    }

    private void init() {
        this.setLayout(JDecimalLayout);
        this.add(integerField);
        this.add(fractionField);
        this.add(comaLabel);
        this.add(plusMinusLabel);
        integerField.setText("0");
        integerField.setHorizontalAlignment(JTextField.RIGHT);
        comaLabel.setText(format.getDecimalFormatSymbols().getDecimalSeparator() + "");
        fractionField.setText(currencyString);
        plusMinusLabel.setText("");
        format.setDecimalSeparatorAlwaysShown(true);
        // borders
        javax.swing.border.Border b = integerField.getBorder();
        integerField.setBorder(null);
        fractionField.setBorder(null);
        comaLabel.setBorder(null);
        plusMinusLabel.setBorder(null);
        this.setBorder(b);
    }

    public void reshape() {
        invalidate();
        validate();
    }

    private class JDecimalLayout implements java.awt.LayoutManager {

        public void addLayoutComponent(String name, Component comp) {
        }

        public void layoutContainer(Container parent) {
            Rectangle r = parent.getBounds();
            FontMetrics fm = parent.getFontMetrics(integerField.getFont());
            int sirinaSlova = fm.stringWidth("0");
            plusMinusLabel.setBounds(new Rectangle(r.width - sirinaSlova - 2, 2, sirinaSlova, r.height - 4));
            fractionField.setBounds(new Rectangle(r.width - sirinaSlova - 2 - sirinaSlova * 2, 2, sirinaSlova * 2 + 1, r.height - 4));
            comaLabel.setBounds(new Rectangle(r.width - 2 - sirinaSlova - sirinaSlova * 2 - sirinaSlova, 0, sirinaSlova, r.height));
            integerField.setBounds(new Rectangle(2, 2, comaLabel.getBounds().x - 2, r.height - 4));
        }

        public Dimension minimumLayoutSize(Container parent) {
            return parent.getPreferredSize();
        }

        public Dimension preferredLayoutSize(Container parent) {
            return parent.getPreferredSize();
        }

        public void removeLayoutComponent(Component comp) {
        }
    }
}

}

4

2 に答える 2

5

デフォルトでは不透明ではないため、JLabel の背景を設定することはできません。したがって、次のようなことをする必要があります。

label.setOpaque(true); 
label.setBackground(Color.WHITE);
于 2013-02-02T23:48:54.177 に答える
4
  1. の確固たる背景を持つためにJPanel必要なのは、それを呼び出すsetBackground()ことだけです。たとえば、あなたinit()の呼び出しでsetBackground(Color.WHITE);JPanelデフォルトではすべて不透明です)
  2. nullレイアウトを使用しないでください。
  3. setPreferredSize()どこにも電話しないで
  4. LayoutManagerメソッドに ,を実装すると、正確に計算する必要があるため、preferredLayoutSize()戻ることができません(無限ループが作成されます)。parent.getPreferredSize();
  5. a を使用しJFormattedTextFieldて、まったく同じ動作を実現し、100 行少なくすることができます。
  6. 常に EDT で UI を開始します (を使用SwingUtilities.invokeLater)

とにかく、ここにあなたのコードの修正版があります:

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;

public class JavaApplication1 {

    public static void main(String[] args) {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception e) {
        }
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame testFrame = new JFrame("Test Frame");
                testFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                JDecimal decimal = new JDecimal();
                testFrame.setLayout(new GridBagLayout());
                testFrame.getContentPane().add(decimal, new GridBagConstraints());
                testFrame.pack();
                testFrame.setLocationRelativeTo(null);
                testFrame.setVisible(true);
            }
        });
    }

    public static class JDecimal extends JPanel {

        private String currencyString = "00";
        private java.text.DecimalFormat format = (java.text.DecimalFormat) java.text.DecimalFormat.getInstance();
        JTextField integerField = new JTextField();
        JLabel comaLabel = new JLabel();
        JTextField fractionField = new JTextField();
        JLabel plusMinusLabel = new JLabel();

        public JDecimal() {
            init();
        }

        public String getText() {
            return integerField.getText() + "." + fractionField.getText();
        }

        private void init() {
            this.setLayout(new GridBagLayout());
            integerField.setColumns(10);
            fractionField.setColumns(2);
            this.add(plusMinusLabel, new GridBagConstraints());
            this.add(integerField, new GridBagConstraints());
            this.add(comaLabel, new GridBagConstraints());
            this.add(fractionField, new GridBagConstraints());
            integerField.setText("0");
            integerField.setHorizontalAlignment(JTextField.RIGHT);
            comaLabel.setText(String.valueOf(format.getDecimalFormatSymbols().getDecimalSeparator()));
            fractionField.setText(currencyString);
            plusMinusLabel.setText(" ");
            format.setDecimalSeparatorAlwaysShown(true);
            // borders
            javax.swing.border.Border b = integerField.getBorder();
            integerField.setBorder(null);
            fractionField.setBorder(null);
            comaLabel.setBorder(null);
            plusMinusLabel.setBorder(null);
            this.setBorder(b);
            setBackground(Color.WHITE);
        }

    }
}
于 2013-02-02T22:27:12.530 に答える