2016-09-26 2 views
0

Как только я нажимаю на JXDatePicker (с именем j в коде программы), то код (названный l1 в моем программном коде) искажается. Я также пытался перерисовать l1 всякий раз, когда нажимается мышь, но это не работает. Любая помощь будет оценена по достоинству.JLabel фон искажается при использовании JXDatePicker

Программа Код:

import java.util.HashMap; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.font.TextAttribute; 
import javax.swing.border.*; 
import org.jdesktop.swingx.JXDatePicker; 
import org.jdesktop.swingx.prompt.PromptSupport; 
import javax.swing.*; 


public class Registration 
{ 
    JFrame stu_reg; 
    JLabel back, logo, header, l1, l2, l3; 
    JButton sub, cls; 
    JTextField t1, t2; 
    JFormattedTextField ft1; 

    Connection c; 

    Registration() 
    { 
     try 
     { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } 
     catch (Exception ex) 
     { 
      ex.printStackTrace(); 
     } 

     stu_reg = new JFrame("Student Registration Form"); 
     stu_reg.setSize(1366,740); 
     stu_reg.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     stu_reg.setLayout(null); 
     stu_reg.setVisible(true); 
     stu_reg.setResizable(false); 


     header = new JLabel("XYZ"); 
     header.setForeground(Color.RED); 
     HashMap<TextAttribute, Object> attribute = new HashMap<TextAttribute, Object>(); 
     attribute.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON); 
     header.setFont(new Font("A.C.M.E. Secret Agent",Font.BOLD,30).deriveFont(attribute)); 
     header.setBounds(350, 0, 800, 75); 
     stu_reg.add(header); 

     ImageIcon image1 = new ImageIcon(Registration.class.getProtectionDomain().getCodeSource().getLocation().getPath() + "xyz.jpg"); 
     back = new JLabel(new ImageIcon(image1.getImage().getScaledInstance(1366, 730, Image.SCALE_SMOOTH))); 
     back.setBounds(0, 0, 1366, 730); 
     stu_reg.add(back); 

     ImageIcon image = new ImageIcon(Registration.class.getProtectionDomain().getCodeSource().getLocation().getPath() + "R2.gif"); 
     logo = new JLabel(new ImageIcon(image.getImage().getScaledInstance(200, 200, Image.SCALE_SMOOTH))); 
     logo.setBounds(1100, 0, 200, 200); 
     back.add(logo); 

     l1 = new JLabel(); 
     l1.setBackground(new Color(100, 100, 100, 70)); 
     l1.setOpaque(true); 
     l1.setBounds(150, 80, 420, 590); 
     LineBorder line = new LineBorder(Color.blue, 2, true); 
     Font f = new Font("Scramble",Font.PLAIN,25).deriveFont(attribute); 
     TitledBorder title = new TitledBorder(line, "Register", TitledBorder.LEFT, TitledBorder.TOP, f, new Color(225,80,0)); 
     l1.setBorder(title); 
     back.add(l1); 

     l2 = new JLabel("FULL NAME"); 
     l2.setFont(new Font("",Font.BOLD,14)); 
     l2.setBounds(27, 50, 100, 35); 
     l1.add(l2); 

     t1 = new JTextField(100); 
     t1.setBounds(25, 80, 175, 35); 
     PromptSupport.setPrompt("First Name", t1); 
     PromptSupport.setFocusBehavior(PromptSupport.FocusBehavior.SHOW_PROMPT, t1); 
     l1.add(t1); 

     t2 = new JTextField(100); 
     t2.setBounds(220, 80, 175, 35); 
     PromptSupport.setPrompt("Last Name", t2); 
     PromptSupport.setFocusBehavior(PromptSupport.FocusBehavior.SHOW_PROMPT, t2); 
     l1.add(t2); 

     l3 = new JLabel("DATE OF BIRTH"); 
     l3.setFont(new Font("",Font.BOLD,14)); 
     l3.setBounds(27, 130, 175, 35); 
     l1.add(l3); 

     JXDatePicker j=new JXDatePicker(); 
     j.setBounds(25, 160, 175, 33); 
     j.addMouseListener(new MouseAdapter() { 
      public void mouseClicked(MouseEvent e) { 
      l1.repaint(); 
      } 
     }); 
     l1.add(j); 


     ToolTipManager.sharedInstance().setEnabled(false); 


    } 

    public static void main(String args[]) 
    { 
     SwingUtilities.invokeLater(()->new Registration()); 
    } 
} 

без искажений

Without Distortion

После Искажение

After Distortion

+0

[Гомоглифический] (https://en.wikipedia.org/wiki/Homoglyph) идентификаторы, такие как 'l1', могут быть довольно загадочными; при использовании вообще, они должны, как правило, иметь самый узкий охват. – trashgod

+0

Использование макета «null» почти никогда не является хорошей идеей. – trashgod

+0

Определить искаженное. – immibis

ответ

4

l1.setBackground (новый цвет (100, 100, 100, 70));

Свинг не поддерживает фонов с прозрачностью. Если компонент непрозрачен, Swing ожидает, что фон будет непрозрачным, а не прозрачным.

Если вам нужен прозрачный фон, вам необходимо сделать обычную роспись.

Для получения дополнительной информации и решений свяжитесь с Backgrounds With Transparency.

+0

Я проверил связь. И включил предложенное изменение. Оно работает! Спасибо! – Enqueue

1

Сначала попробуйте установить цвет фона, как так:

l1.setBackground(new Color(100, 100, 100, 255)); 
l1.setOpaque(false); 

Дайте ему испытание, делает эту работу сейчас?

Если он не работает, также удалите следующую строку UIManager в начале кода UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());, а затем повторите тест. Часто некоторые взгляды & feel's не позволит вам правильно использовать прозрачность.

Если это работает сейчас, то вы знаете, что вам придется либо отказаться от внешнего вида, либо сохранить его, и использовать обычную живопись, как предлагал камикр.

+0

Любое из утверждений l1.setBackground (новый цвет (100, 100, 100, 255)) или l1.setOpaque (false) работает. Но они забирают полупрозрачность JLabel. Во всяком случае, я пробовал с тем, что сказал камикр, и это помогло. Спасибо! – Enqueue

Смежные вопросы