两个GUI组件之间有趣的绑定问题

时间:2015-06-03 13:48:14

标签: java swing binding jcombobox jcheckbox

我遇到了以下问题:

我有一个JCheckbox,带有一个关联的JComboBox。 (嗯,它只与它在标签上水平相邻的事实相关联,而且,命名惯例是它们名字的前几个字符总是相同的,表明它们属于一起)。我有这些类型组件的监听器,在它发生变化时做一些事情。

现在,这些类型的元素可以出现在选项卡式窗格中(在不同的选项卡上)。 复选框可能没有Comboboxes,但如果没有Checkbox关联,则无法显示组合框。

目前,我有兴趣构建一个日志字符串,如下所示: (选项卡式面板的名称)>(JPanel的名称)>(复选框的名称)>(组合框的名称)

- >当然我会停在Checkbox名称,如果组合框没有改变,但是如果Combobox改变了,我想将它与它的Checkbox联系起来。 当然所有这些都发生在两个组件的动作事件处理程序中...... 此外,我已经获得了选项卡式面板的名称,jpanel和复选框。

这里的问题是以某种方式将组合框与复选框绑定,以便在组合框发生变化时获取复选框信息。

我希望这很清楚,请询问是否有任何需要澄清的内容

1 个答案:

答案 0 :(得分:1)

如评论中所述,您可以创建新的组合控件并使用 这不是单CheckBoxpublic class CheckCombo extends javax.swing.JPanel { private final javax.swing.JCheckBox jCheckBox1; private final javax.swing.JComboBox jComboBox1; public CheckCombo() { jCheckBox1 = new javax.swing.JCheckBox(); jComboBox1 = new javax.swing.JComboBox(); this.setLayout(new java.awt.BorderLayout()); this.add(jCheckBox1, java.awt.BorderLayout.WEST); this.add(jComboBox1, java.awt.BorderLayout.CENTER); } public javax.swing.JComboBox getComboBox() { return jComboBox1; } public void setCheckboxSelected(boolean b) { jCheckBox1.setSelected(b); } public void setComboBoxVisible(boolean b) { jComboBox1.setVisible(b); } public void setCheckboxText(String s) { jCheckBox1.setText(s); } }

组合控制的简单示例:

ComboBox

只需将我的示例中的常规CheckCombo替换为Checkbox,然后移除关联的CheckCombo。 您可以使用公共方法修改#import "RosterTableTableViewController.h" #import "TFHpple.h" #import "RosterListing.h" #import "RosterListingCellTableViewCell.h" #import "PlayerDetailViewController.h" #import <iAd/iAd.h> #define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) @interface RosterTableTableViewController () <ADBannerViewDelegate> { BOOL _bannerIsVisible; ADBannerView *_adBanner; } @property (nonatomic, strong) NSMutableArray *rosters; @property NSCache *imageCache; @end @implementation RosterTableTableViewController - (void) loadRoster { NSURL *RosterURL = [NSURL URLWithString:@"myURL"]; ... self.rosters = rosterItems; } - (void)viewDidLoad { [super viewDidLoad]; dispatch_queue_t backgroundQueue = dispatch_queue_create("com.lancers.myqueue", 0); //dispatch in background dispatch_async(backgroundQueue, ^{ //execute long operation in background thread //dispatch in main thread after long operation is finish [self loadRoster]; dispatch_async(dispatch_get_main_queue(), ^{ [self.tableView reloadData]; }); }); // Load the Cell NIB file ... } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // Get a new or recycled cell RosterListingCellTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"RosterCell" forIndexPath:indexPath]; RosterListing *thisRosterListing = [self.rosters objectAtIndex:indexPath.row]; cell.playerNumberLabel.text = [NSString stringWithFormat:@"#%@",thisRosterListing.playerNumber]; cell.playerNameLabel.text = thisRosterListing.playerName; cell.imageView.contentMode = UIViewContentModeScaleAspectFill; cell.imageView.clipsToBounds = YES; UIImage *playerImage = [self.imageCache objectForKey:thisRosterListing.playerImageURL]; cell.imageView.image = playerImage; if (playerImage == nil) { NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil]; thisRosterListing.playerImageURL = [thisRosterListing.playerImageURL stringByReplacingOccurrencesOfString:@"small" withString:@"medium"]; NSURLSessionDataTask *imageData = [session dataTaskWithURL:[NSURL URLWithString: thisRosterListing.playerImageURL] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { // handle NSData UIImage *image = [UIImage imageWithData:data]; thisRosterListing.image = image; [self.imageCache setObject:image forKey:thisRosterListing.playerImageURL]; cell.imageView.image = image; dispatch_async(dispatch_get_main_queue(), ^{ [self.tableView reloadData]; }); }]; [imageData resume]; } return cell; } -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 65)]; view.backgroundColor = [UIColor clearColor]; _adBanner = [[ADBannerView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)]; //_adBanner.delegate = self; _adBanner.backgroundColor = [UIColor clearColor]; [view addSubview:_adBanner]; return view; } - (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 65; } @end 的状态。

干杯。